返回的文档顺序是什么?
返回的文档顺序是什么?
我有一个集合,并进行了以下查询:
db.getCollection("test").find( {"$or":[{_id:NumberLong("1234")}, {_id:NumberLong("1230")}, {_id:NumberLong("1237")}, {_id:NumberLong("1236")}} )
返回的文档将按照什么顺序?我需要的是这个确切的顺序(与$or
语句的顺序相同):
1234 1230 1237 1236
通常情况下,当我执行上述查询时,我看到的顺序就是这样,但今天我看到一个返回了不同顺序的查询结果(仅此一次,因为在重启服务器后,顺序又正常了)。那么,如何确保我得到我所需的确切顺序?
问题的出现原因是需要对返回的文档进行排序,但是在模型中没有自然的排序字段。解决方法是使用$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 } } ])
感谢mickl提供的建议,使用addFields是一个好主意!