我有一个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来计算它们。有什么想法吗?
答案 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 } }
])