0

我有一个 mongo 集合,其中包含以下文件 -

{
_id : 1abc,
'data' :'blah',
'createdDate' : ISODate("2013-05-26T01:34:10Z"),
'a': [
    {
        _id : a1adas,
        'createdDate' : ISODate("2013-05-26T01:35:10Z"),
        'b':[
                {
                    _id : aadaasd
                    'createdDate' : ISODate("2013-05-26T01:37:10Z"),
                }
            ]
    }
]

}

我需要按时间倒序对文档进行排序,以便在任何级别上具有最新 createdDate 的文档都排在第一位。

到目前为止,我有这个查询,我不确定它是否按预期工作。

db.collection.find({'data':'blah'}).sort({'createdDate':-1, 'a.createdDate': -1, 'a.b.createdDate': -1 }).explain();

我想知道是否有更有效的方法来执行这种排序。

4

1 回答 1

2

您的查询没有按照您的意愿执行。多个字段的 MongoDB 排序将依次处理每个字段,而不是所有三个字段一起处理。例如,我将一些测试文档插入到一个集合中,并运行了类似的排序:

> db.numbers.find().sort( { a : -1, b : -1, c : -1 })
{ doc : "doc1", "a" : 13, "b" : 5, "c" : 7 }
{ doc : "doc2", "a" : 12, "b" : 20, "c" : 91 }
{ doc: "doc3", "a" : 2, "b" : 50, "c" : 700 }

"doc3" 的 a 值最小,所以最后返回。但是,它也具有排序中所有字段的最高值,所以理论上我们希望它是第一个返回的东西。我们可以使用 MongoDB 的聚合框架来做到这一点:

db.numbers.aggregate(
{ $project : { 
    _id : 1, 
    a : 1, 
    maxNum : { $cond: [{ $gte : [ "$b", "$c" ]}, "$b" , "$c" ]} // max of b, c
    }},
{ $project : { 
   _id : 1, 
   maxNum : { $cond: [{ $gte : [ "$a", "$maxNum" ]}, "$a" , "$maxNum" ]} // max of a, b, c 
   }}, 
{ $sort : { maxNum : -1 } } 
)

此聚合查询会将您的数据转换为可以正确执行排序的表单。但是,要看到它的表现并不容易。目前没有用于聚合查询的 .explain() 函数。

于 2013-09-19T15:33:31.053 回答