Mongo 计数所有集合文档中出现的数组项

Posted

技术标签:

【中文标题】Mongo 计数所有集合文档中出现的数组项【英文标题】:Mongo count array item occurrences across all collection documents 【发布时间】:2020-01-28 16:35:08 【问题描述】:

我有一个 mongo 集合,其中每个文档都有一个包含多个主题标签的数组(一个简单的字符串)。我想计算每个主题标签出现的次数并返回如下内容:

hashtag: "hashtag1",
 count: numOcurrences

hashtag: "hashtag2",
 count: numOcurrences

...

看起来和problem类似,但是因为我不想按任何参数过滤,所以只计算整体出现我认为它必须是一种更清洁的方法来解决这个问题,遗憾的是我的mongo知识非常有限...

标签所在的集合,看起来与此类似,是标签数组中的“hastag”字段:

"_id": ...,
 "hashtag" : [
   "hashtag1",
    "hashtag2"
  ],
 "likes" : ...
,
"_id": ...,
 ...

【问题讨论】:

【参考方案1】:

您的情况比您提到的其他问题要容易一些,您可以使用下面的聚合来解决它:

db.hashtags.aggregate([
  
    "$unwind": "$hashtag"
  ,
  
    "$group": 
      "_id": "$hashtag",
      "count": 
        "$sum": 1
      
    
  ,
  // you can skip this projection if it's okay for you to have the result like [ _id: "hashtag1", count: 2 ]
  
    "$project": 
      "_id": 0,
      "hashtag": "$_id",
      "count": 1
    
  
])

您可以在mongoplayground 中看到一个工作示例

【讨论】:

非常感谢,原来如此!

以上是关于Mongo 计数所有集合文档中出现的数组项的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有 Meteor Mongo 集合名称检索为 Javascript 数组?

Mongo 聚合计数子文档(计数回复评论)

更新 mongo 文档数组中的单个子文档的计数

Mongo - 从对象更新集合的每个文档

从其他特定集合中获取文档计数颤振火力基地

从集合中删除文档并从另一个集合中的数组中删除 Id