2014-05-17 22 views
0

我有如下所示的db結構。如何檢索子文檔數組中的所有文檔,以及是否有任何重複的字段如何檢索最新的文檔?

{ 
    "_id": ObjectId("53770b9de4b0ba6f4c976a27"), 
    "source": [{ 
     "value": 5127, 
     "createdAt": ISODate("2014-05-7T07:11:00Z"), 
     "generated": ISODate("2014-05-17T07:23:00Z"), 
    }, { 
     "value": 5187, 
     "createdAt": ISODate("2014-05-17T07:39:00Z"), 
     "generated": ISODate("2014-05-17T07:40:00Z"), 
    }, { 
     "value": 5187, 
     "createdAt": ISODate("2014-05-17T07:39:00Z"), 
     "generated": ISODate("2014-05-17T07:41:00Z") 
    }], 
} 

在此有子文檔重複array.I需要編寫蒙戈DB查詢以檢索所有的子文檔,如果有任何重複,然後基於「生成」 值我需要最好像下面那樣獲得最新版本。

{ 
    "_id": ObjectId("53770b9de4b0ba6f4c976a27"), 
    "source": [{ 
     "value": 5127, 
     "createdAt": ISODate("2014-05-17T07:11:00Z"), 
    }, { 
     "value": 5187, 
     "createdAt": ISODate("2014-05-17T07:39:00Z"), 
     "generated": ISODate("2014-05-17T07:41:00Z") 

    }], 

} 

有什麼辦法可以像使用mongo db查詢那樣獲取數據嗎?

+0

請記住格式化你的代碼(我做了這個時候編輯您的帖子,看看如何。它的作品),讓其他人可以更容易地閱讀你的文章。 – yaoxing

回答

0

隨着aggregation framework你可以完成這項工作。

db.test.aggregate([ 
    {$unwind: '$source'}, 
    {$group: {_id: {value: "$source.value", createdAt: "$source.createdAt"}, generated: {$max: "$source.generated"}}} 
]); 

它給你的結果:從你想要什麼

{ "_id" : { "value" : 5187, "createdAt" : ISODate("2014-05-17T07:39:00Z") }, "generated" : ISODate("2014-05-17T07:41:00Z") } 
{ "_id" : { "value" : 5127, "createdAt" : ISODate("2014-05-07T07:11:00Z") }, "generated" : ISODate("2014-05-17T07:23:00Z") } 

有點不同。但是,如果你真的想上面的格式,試試這個:

db.test.aggregate([ 
    {$unwind: '$source'}, 
    {$group: {_id: {_id: "$_id", value: "$source.value", createdAt: "$source.createdAt"}, generated: {$max: "$source.generated"}}}, 
    {$group: {_id: "$_id._id", source: {$push: {value: "$_id.value", createdAt: "$_id.createdAt", generated: "$generated"}}}} 
]); 

它給你:

{ 
    "_id": ObjectId("53770b9de4b0ba6f4c976a27"), 
    "source": [{ 
     "value": 5187, 
     "createdAt": ISODate("2014-05-17T07:39:00Z"), 
     "generated": ISODate("2014-05-17T07:41:00Z") 
    }, { 
     "value": 5127, 
     "createdAt": ISODate("2014-05-07T07:11:00Z"), 
     "generated": ISODate("2014-05-17T07:23:00Z") 
    }] 
}