У меня есть два поля:
ISODate
)number
- однако также может быть undefined
)Я хочу сортировать их определенным образом.
Во-первых - сортировка по value
. Если он существует (не undefined
), пусть они на первом месте. Если value
не определено, нажмите эти объекты в конце.
Во-вторых - сортировать по date
. Итак, в этот момент у нас будет все, что сортируется по value
. Но теперь я хочу сортировать его по date
.
[
{
value: 1,
date: today, // ofc it a date but just to represent the case
},
{
value: 2,
date: yesterday,
},
{
value: undefined,
date: today,
},
{
value: undefined,
date: yesterday,
}
]
.sort({
value: -1,
date: -1
});
Однако в некоторых ситуациях это терпит неудачу, к сожалению, Im не может определить, почему он иногда сортирует его неправильно. Но это так...
заранее спасибо
Для этого вы можете использовать
aggregate
с$cond
.
db.getCollection('collectionName').aggregate([
{
$project :
{
"id" : 1,
"value" : 1,
"date": 1,
sortValue: {
$cond: {
if: { $eq: ['$value',undefined ]},
then: 0,
else: 1,
},
}
}
},
{
$sort :
{
"sortValue" :-1,
"value" : 1,
"date" : -1
}
}])
Протестировано в Mongo GUI.
Совокупность в Mongoose:
Model.aggregate([
{
$project:
{
"id": 1,
"value": 1,
"date": 1,
sortValue: {
$cond: {
if: { $eq: ['$value', undefined] },
then: 0,
else: 1,
},
}
}
},
{
$sort:
{
"sortValue": -1,
"value": 1,
"date": -1
}
}
], function (err, result) {
if (err) {
console.log(err);
return;
}
console.log(result);
});