我正在使用MongoDB和10Gen node.js驱动程序。
我在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"
]
但我需要点数。
答案 0 :(得分: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可能有所帮助。