我有两个字段:
ISODate
)number
-也可以是undefined
)我想按特定方式对它们进行排序。
首先-按value
排序。如果存在(不存在undefined
),请让他们先行。如果未定义value
,请在末尾推送这些对象。
第二-按date
排序。因此,此刻,我们将按value
进行排序。但是现在我想按date
对其进行排序。
[
{
value: 1,
date: today, // ofc it's 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
});
但是在某些情况下它失败了,不幸的是,我无法检测为什么有时会以错误的方式对它进行排序。但这确实...
提前谢谢
答案 0 :(得分:2)
要实现此目的,您可以将
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中测试。
猫鼬总计:
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);
});