获取MongoDB文档中嵌入式集合的数量

时间:2012-07-15 19:45:49

标签: node.js mongodb

我正在使用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"
]

但我需要点数。

1 个答案:

答案 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可能有所帮助。