计算集合中mongodb文档中标记数组中的标记

Zlo*_*niy 4 mongodb mongodb-query aggregation-framework

我有一个mongo推文集,每个文档看起来像这样:

{ _id:'1234567', 
date:'9/27/08 3:21', 
tweet:'Some text here and some #hashtag and one more #hashtag2', 
a_name:'name', 
a_nick:'nick', 
hashtags:['#hashtag' , '#hashtag2' ]} 
Run Code Online (Sandbox Code Playgroud)

我需要使用聚合计算所有条目中#hashtag和#hashtag2的所有出现次数.到目前为止,我有这样的事情:

 db.tweets.aggregate(
 { $project: { hashtags:1}},
 { $unwind: "$hashtags" },
 { $group: { _id: "hashtags", count: { $sum: 1 }}}
 );
Run Code Online (Sandbox Code Playgroud)

但是这给我带来了所有主题标签的数量.如果我删除该$group行,我会得到一个包含所有单独哈希标记的列表,这很好,但我希望能够$aggregation仅使用和mongo 计算它们.有任何想法吗?

Nei*_*unn 12

我认为你可能只是输入错误或其他误解:

db.tweets.aggregate([
   { "$project": { "hashtags":1 }},  
   { "$unwind": "$hashtags" },  
   { "$group": { "_id": "$hashtags", "count": { "$sum": 1 } }}  
])
Run Code Online (Sandbox Code Playgroud)

因此,_id组中的值需要"$hashtags"而不是"hashtags"您使用的值.这是因为它使用字段的实际值,结果是每个"#标签"的计数.

如果没有$声明你想要字段的值,它只是一个字符串.因此,对不匹配的字符串进行分组会将所有内容分组.

这样就可以为每个标签提供计数.实际上,如果您没有列出每个标签,那么您正在查找"唯一"标签的总数.你可以像这样修改:

db.tweets.aggregate([
   { "$project": { "hashtags":1 }},  
   { "$unwind": "$hashtags" },  
   { "$group": { "_id": "$hashtags" }},
   { "$group": { "_id": null, "count": { "$sum": 1 } }
])
Run Code Online (Sandbox Code Playgroud)

所以这只是总结.还有另一种方法可以使用$addToSet运算符来完成此操作,但它实际上只是在管道中创建了额外的工作,并不是该运算符的最佳用例.但仅供参考:

db.tweets.aggregate([
   { "$project": { "hashtags":1 }},  
   { "$unwind": "$hashtags" },  
   { "$group": { 
       "_id": null, 
       "hashtags": { "$addToSet": "$hashtags" }
   }},
   { "$unwind": "$hashtags" },
   { "$group": { "_id": null, "count": { "$sum": 1 } }
])
Run Code Online (Sandbox Code Playgroud)