Сортировать только существующие поля

1

У меня есть такая коллекция. Только у нескольких пользователей есть поле sortOrder

[{
    "_id": "59ccf78bde3d14019169c105",
    "name": "Best FX broker ",
},
{
    "_id": "59ccf78bde3d14019169c102",
    "name": "Best automated Performance tool ",
    "sortOrder": 1,
},
{
    "_id": "59ccf78bde3d14019169c104",
    "name": "Best Regtech/ reporting solution ",
},
{
    "_id": "59ccf78bde3d14019169c106",
    "name": "NEW: BEST CRYPTO SERVICE PROVIDER",
    "sortOrder": 2,
}]

Когда я сортирую sort({"sortOrder": 1}) я получаю это

[{
    "_id": "59ccf78bde3d14019169c105",
    "name": "Best FX broker ",
},
{
    "_id": "59ccf78bde3d14019169c104",
    "name": "Best Regtech/ reporting solution ",
},
{
   "_id": "59ccf78bde3d14019169c102",
    "name": "Best automated Performance tool ",
    "sortOrder": 1,
},
{
    "_id": "59ccf78bde3d14019169c106",
    "name": "NEW: BEST CRYPTO SERVICE PROVIDER",
    "sortOrder": 2,
}]

Но мне нужно сортировать такую коллекцию (значения с полем sortOrder сверху)

[ {
   "_id": "59ccf78bde3d14019169c102",
    "name": "Best automated Performance tool ",
    "sortOrder": 1,
},
{
    "_id": "59ccf78bde3d14019169c106",
    "name": "NEW: BEST CRYPTO SERVICE PROVIDER",
    "sortOrder": 2,
},
{
    "_id": "59ccf78bde3d14019169c105",
    "name": "Best FX broker ",
},
{
    "_id": "59ccf78bde3d14019169c104",
    "name": "Best Regtech/ reporting solution ",
}]

Какой запрос я должен написать, чтобы получить это?

  • 2
    Не похоже, что ваш конкретный вариант использования поддерживается, но есть некоторые обходные пути / другие методы, которые, возможно, дадут вам то, что вы хотите. См. Stackoverflow.com/questions/36028267/… и stackoverflow.com/questions/32680809/…
Теги:
mongoose
mongodb-query

2 ответа

1
Лучший ответ

db.collection.aggregate([{$ project: {"_id": 1, "sortOrder": 1, "name": 1, "sortOrder": {"$ ifNull": ["$ sortOrder", ""]} }}, {$ sort: {sortOrder: 1}}

])

0

Вы можете использовать обратные вызовы для обработки сортировки практически любым способом.

Хотя мое решение отвратительно неэффективно (извините), оно работает:

array.sort(function (a, b) {
  if (a.sortOrder == undefined && b.sortOrder == undefined) {
    return 0;
  }
  if (a.sortOrder == undefined) {
    return 1;
  }
  if (b.sortOrder == undefined) {
    return -1;
  }
  if (a.sortOrder > b.sortOrder) {
    return 1;
  }
  if (a.sortOrder < b.sortOrder) {
    return -1;
  }

  return 0;
});

Здесь переменные a и b являются элементами в массиве, и здесь возвращение -1 перемещает его в начало массива, 0 не изменяется, 1 перемещает его обратно из массива, если это имеет смысл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню