2013-07-09 49 views
0

我有一個蒙戈集合與文檔喜歡 -蒙戈排序嵌套數組中的多個字段

{ 
_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"), 
       } 
      ] 
    } 
] 

}

我需要按時間倒序排列的文件進行排序,以便與文檔最先創建的日期,在任何級別上都是第一個。

到目前爲止,我有這個查詢,我不確定是否按預期工作。

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

我想知道是否有更高效的方式來執行這樣的排序。

回答

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的」具有的最低值,所以它返回最後。然而,它在這個領域的任何領域也是最高的,所以理論上我們希望它是第一個返回的東西。我們可以使用MongoDB的aggregation framework做到這一點:

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()函數。