2012-07-15 59 views
2

我正在使用MongoDB和10Gen node.js驅動程序。獲取MongoDB文檔中嵌入式集合的計數

我在MongoDB的集合,它具有類似於此文檔:

{ 
_id: ObjectId("500310affdc47af710000001"), 
name:'something', 
tags:['apple','fruit','red'], 
created: Date(1342378221351) 
} 

我想獲得的就是看着所有的文件和集合中獲得所有文檔的所有標籤的重複計數。我試過組功能,得到了這個:

> db.photos.group(
... {cond:{} 
... ,key:{tags:true} 
... ,initial:{count:0} 
... ,reduce:function(doc,out){out.count++} 
... ,finalize:function(out){}}); 
[ 
    { 
     "tags" : null, 
     "count" : 35 
    }, 
    { 
     "tags" : [ 
      "#strawberry", 
      "#friutpicture" 
     ], 
     "count" : 1 
    } 
] 

這是不對的。我可以得到清晰的沒有像這樣的計數:

> db.photos.distinct('tags') 
[ 
    "#friutpicture", 
    "#strawberry", 
    "#factory", 
    "#wallpaper", 
    "#bummber", 
    "#test", 
    "#fire", 
    "#watermark" 
] 

但我需要計數。

回答

5

您可以使用新的聚合框架下(2.1以上版本):

> db.photos..aggregate([{$unwind:"$tags"}, 
         {$group:{_id:"$tags"}}, 
         {$group:{_id:"DistictCount",count:{$sum:1}}}]) 

你的結果將是:

{ 
    "result" : [ 
     { 
      "_id" : "DistictCount", 
      "count" : 8 
     } 
    ], 
    "ok" : 1 
} 

組功能不會做你所需要的,因爲你需要「展開」標籤數組,然後才能對其進行分組,這意味着您需要一個能夠發出文檔中每個標籤的地圖功能以及一個縮減。如果您遇到2.0或更低版本,並且無法使用聚合框架,則可以使用map/reduce。這裏有an example可能有幫助。

+0

我困在2.0.6中。我跟着鏈接,發現這個食譜:[這裏](http://cookbook.mongodb.org/patterns/count_tags/),正是我需要感謝! – 2012-07-15 22:28:22

相關問題