node.js - 获取 MongoDB 文档中嵌入集合的计数

标签 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"
]

但我需要计数。

最佳答案

您可以在新的聚合框架 (2.1+) 中使用以下内容:

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

您的结果将是:

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

group 函数不会做你需要的事情,因为你需要先“展开”标签数组,然后才能对它进行分组,这意味着你需要一个映射函数来发出文档中的每个标签,以及一个reduce 。如果您停留在 2.0 或更早版本并且无法使用聚合框架,您可以使用 map/reduce。这是an example这可能会有所帮助。

关于node.js - 获取 MongoDB 文档中嵌入集合的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11495060/

相关文章:

node.js - 媒体播放器在 Google Assistant 上运行良好,而模拟器则不然

mysql - Nodejs.Mysql 模块未安装

mongodb - Docker mongodb-将磁盘上的数据库添加到容器

MongoDB MapReduce - 发出一个键/一个值不调用reduce

c# - MongoDB的最大容量是多少?它是完全可扩展的数据库吗?

node.js - MapReduce 确定分类账中的信用余额

node.js - Azure "Web apps"服务 : auto-install npm modules from package. json

javascript - 通过增加 javascript 中的数字使记录唯一

java - Elasticsearch 和 mongodb,部分搜索不起作用

mongodb - 如何安装特定版本的MongoDB?