【问题标题】:Count tags in tag array in a mongodb document inside a collection在集合内的 mongodb 文档中计算标签数组中的标签
【发布时间】:2017-06-26 20:20:15
【问题描述】:

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

【问题讨论】:

  • “所有实体”是什么意思?您想计算整个系列中的所有“独特”标签吗?还是您想计算每个文档的数量?
  • 我想统计整个集合中的所有唯一标签。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

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

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

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

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

这样就可以计算出每个标签的数量。如果实际上您正在寻找“唯一”标签的 total 数量,而没有列出每个标签。你可以这样修改:

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 } }
])

【讨论】:

  • 哦,我的,是的,我在 id 中缺少主题标签之前的 $。代码是这样的: db.tweets.aggregate( { $project: { hashtags:1}}, { $unwind: "$hashtags" }, { $group: { _id: "$hashtags", count: { $sum : 1 }}} );
  • 重要的是要记住 $out 仅适用于聚合查询。例如,我必须找到(在我的情况下)具有数组“用户”的文档,并且在 ID 中必须明确为 123456,因此要将所有这些文档发送到我使用的新集合:db.colelction.aggregate( [ { $match : { "user.id" : 123456 } }, {$out: "mynewcollection"}] )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多