返回的文档顺序是什么?

20 浏览
0 Comments

返回的文档顺序是什么?

我有一个集合,并进行了以下查询:

db.getCollection("test").find(
{"$or":[{_id:NumberLong("1234")},
        {_id:NumberLong("1230")},
        {_id:NumberLong("1237")},
        {_id:NumberLong("1236")}}
)

返回的文档将按照什么顺序?我需要的是这个确切的顺序(与$or语句的顺序相同):

1234
1230
1237
1236

通常情况下,当我执行上述查询时,我看到的顺序就是这样,但今天我看到一个返回了不同顺序的查询结果(仅此一次,因为在重启服务器后,顺序又正常了)。那么,如何确保我得到我所需的确切顺序?

0
0 Comments

问题的出现原因是需要对返回的文档进行排序,但是在模型中没有自然的排序字段。解决方法是使用$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是一个好主意!

0