У меня есть такая коллекция. Только у нескольких пользователей есть поле 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 ",
}]
Какой запрос я должен написать, чтобы получить это?
db.collection.aggregate([{$ project: {"_id": 1, "sortOrder": 1, "name": 1, "sortOrder": {"$ ifNull": ["$ sortOrder", ""]} }}, {$ sort: {sortOrder: 1}}
])
Вы можете использовать обратные вызовы для обработки сортировки практически любым способом.
Хотя мое решение отвратительно неэффективно (извините), оно работает:
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 перемещает его обратно из массива, если это имеет смысл.