我有一个收藏夹,我执行以下查询:
db.getCollection("test").find(
{"$or":[{_id:NumberLong("1234")},
{_id:NumberLong("1230")},
{_id:NumberLong("1237")},
{_id:NumberLong("1236")}}
)
将按顺序退回文件?我需要这个确切的顺序($or
语句的顺序):
1234
1230
1237
1236
通常这是我执行上一个查询时看到的顺序,但是今天我看到一个查询返回了一个不同的顺序(这只是一次,因为在我重新启动服务器后,该顺序又恢复了)。那么该怎么做才能准确确定我需要的订单呢?
答案 0 :(得分:1)
您必须使用$sort来确保按所需顺序返回结果。由于您的模型中没有自然的“排序”字段候选者,因此您可以使用$addFields并仅出于$sort
的目的添加临时字段。可以使用$indexOfArray运算符对其进行评估。您也可以使用该字段进行过滤(如果不匹配,$indexOfArray
返回-1
db.test.aggregate([
{
$addFields: {
order: { $indexOfArray: [ [NumberLong("1234"), NumberLong("1230"), NumberLong("1237"), NumberLong("1236") ], "$_id" ] }
}
},
{
$match: { order: { $ne: -1 } }
},
{
$sort: { order:1 }
},
{
$project: { order: 0 }
}
])