MongoDB在不同文档中汇总数组中的项目数?

Posted

技术标签:

【中文标题】MongoDB在不同文档中汇总数组中的项目数?【英文标题】:MongoDB aggregate count of items in array across different documents? 【发布时间】:2015-11-16 06:29:27 【问题描述】:

这是我的 MongoDB 集合架构:

company: String
model: String
tags: [String]

我需要聚合它,以便得到以下输出:

[
  "_id": 
    "company": "Lenovo",
    "model": "T400"
  ,
  "tags": 
    tag: "SomeTag"
    count: 124 // number of times, this tag was found in `Lenovo T400`
  
...]

我尝试执行以下操作:

var aggParams = ;
aggParams.push( $unwind: '$tags' );
aggParams.push( $group: 
  _id:  company: '$company', model: '$model'  ,
  tags:  $push:   tag: '$tags', count:  $sum: 1   ,
);

但我收到以下错误:

invalid operator '$sum'

使用aggregation 的正确方法是什么?

【问题讨论】:

您的数据与您的架构相矛盾。您的实际数据中的“标签”是什么?一个字符串?还是数组? [String] - 代表一个字符串数组 【参考方案1】:

您需要在数组上处理$unwind 以便在聚合中有意义地处理它。您还可以添加到一个数组并“计数”一个单独的阶段。以及参数“数组”本身中的聚合管道,而不是您定义的对象:

Model.aggregate([
     "$unwind": "$tags" ,
     "$group": 
        "_id": 
            "company": "$company",
            "model": "$model",
            "tag": "$tags"
        ,
        "count":  "$sum": 1 
    ,
     "$group": 
        "_id":  
            "company": "$_id.company",
            "model": "$_id.model",
         ,
         "tags":  "$push":  "tag": "$_id.tag", "count": "$count" 
    
], function(err,result) 

)

所以两个$group 阶段在这里完成了这项工作。一个用于总结公司和模型中的标签,另一个仅对“公司”和“模型”进行分组,并将不同的标签和计数添加到数组中。

【讨论】:

以上是关于MongoDB在不同文档中汇总数组中的项目数?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:计算数组中的项目数

如何删除 mongodb 特定文档中的数组中的项目? [复制]

将项目附加到 PyMongo 中的 MongoDB 文档数组而不重新插入

根据对象数组中不匹配的属性查找匹配的文档 - MongoDB

仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档

MongoDB聚合查询 - 返回嵌套子文档中的所有项目