2015-08-14 131 views
0

我正在使用MongoDB作爲數據庫來處理項目,而且遇到了一個問題:找不到正確的查詢來簡化計數的文件。我用的集合是這樣的:獲取MongoDB中每個文檔喜歡的文檔數

{ "username" : "example1", 
    "like" : [ { "document_id" : "doc1" }, 
       "document_id" : "doc2 }, 
       ...] 
} 

所以我需要的是計算在每個文檔的喜歡的號碼,以便在年底我會有

{ "document_id" : "docA" , nbLikes : 30 }, {"document_id" : "docB", nbLikes : 1} 

誰能幫我在這因爲我失敗了。

+0

我想作爲一個解決方案是檢索所有的文件,這樣我們將有[{「DOCUMENT_ID」:「文檔1」},{「DOCUMENT_ID」:「DOC2」}, {「document_id」:「doc1」},{「document_id」:「doc3」} ...]然後進行組和計數。但是有可能做到第一步? – rsabir

回答

0

您可以通過退繞like陣列的每個文檔,然後通過document_id分組得到的每個值計數做到這一點:

db.test.aggregate([ 
    // Duplicate each doc, once per 'like' array element 
    {$unwind: '$like'}, 
    // Group them by document_id and assemble a count 
    {$group: {_id: '$like.document_id', nbLikes: {$sum: 1}}}, 
    // Reshape the docs to match the desired output 
    {$project: {_id: 0, document_id: '$_id', nbLikes: 1}} 
]) 
+0

它像一個魅力,感謝你。我只添加了一個小優化: db.favorites.aggregate([ {$ project:{username:1,likes:1}}, {$ unwind:'$ likes'}, {$ group:{_id :'$ likes.document_id',nbLikes:{$ sum:1}}}, {$ project:{_id:0,document_id:'$ _id',nbLikes:1}} ]) 因爲我的收藏更多比那複雜 – rsabir

0

添加「likeCount」領域,增加數每$推運讀「likeCount」字段

db.test.update(
    { _id: "..." }, 
    { 
     $inc: { likeCount: 1 }, 
     $push: { like: { "document_id" : "doc1" } } 
    } 
)