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

时间:2014-04-08 01:31:53

标签: 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' ]} 

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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

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

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

这样就可以为每个标签提供计数。实际上,如果您要查找个“唯一”标记而未列出每个标记。你可以像这样修改:

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

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

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