当前位置: 首页 > 知识库问答 >
问题:

MongoDB聚合查询组By

田宇
2023-03-14

假设我有一个MongoDB集合,其中包含以下信息:

{
  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  state: 'CA',
  price: 50,
  item: apple,
  color: red
}
{
  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  state: 'WA',
  price: 25,
  item: apple,
  color: green
}
{
  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  state: 'CA',
  price: 75,
  item: orange,
  color: orange
}
{
  cust_id: "def456",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  state: 'OR',
  price: 75,
  item: apple,
  color: red
}

我想计算按州分组的订单总价的总和,其中项目为“苹果”,颜色为“红色”。我的问题是:

{
  $match: {$and: [{item : "apple"}, {color : "red"}]},
  $group: {_id: {state: "$state", cust_id: "$cust_id"}, total: {$sum: "$price"}}
}

但是,我希望能够将我的结果cust\u id包含在\u id中,它是一个数组/映射/一些结构,其中包含构成我的合计的所有客户id的列表。因此,我希望我的输出包含

cust_id {'abc123', 'def456'}

是否有办法处理此mongo聚合/查询?或者是一种更好的方式来构造此查询,以便我可以按州分组计算红苹果的总成本,并包括属于此类别的所有客户?我把它放在\u id部分是为了提取信息,但这些数据是否包含在那里并不重要。我只想通过上述聚合选择按状态分组并获取所有客户ID的集合。

共有1个答案

章玮
2023-03-14

是的,在聚合$组管道中,您可以使用$addToSet聚合操作符将客户id添加到数组中,同时仍可以按状态分组:

db.collection.aggregate([
    {
        "$match": {
            "item": "apple", 
            "color" : "red"
        }
    },
    {
        "$group": {
            "_id": "$state",
            "cust_id": {
                "$addToSet": "$cust_id"
            },
            "total": {
                "$sum": "$price"
            }
        }
    }
]);

输出:

/* 1 */
{
    "result" : [ 
        {
            "_id" : "OR",
            "cust_id" : [ 
                "def456"
            ],
            "total" : 75
        }, 
        {
            "_id" : "CA",
            "cust_id" : [ 
                "abc123"
            ],
            "total" : 50
        }
    ],
    "ok" : 1
}
 类似资料:
  • 我使用Nodejs和MongoDB与expressjs和mongoose库,创建一个具有用户、文章和评论模式的博客API。下面是我使用的模式。

  • 主要内容:aggregate() 方法,管道MongoDB 中的聚合操作用来处理数据并返回计算结果,聚合操作可以将多个文档中的值组合在一起,并可对数据执行各种操作,以返回单个结果,有点类似于 SQL 语句中的 count(*)、group by 等。 aggregate() 方法 您可以使用 MongoDB 中的 aggregate() 方法来执行聚合操作,其语法格式如下: db.collection_name.aggregate(aggr

  • 有人能帮我把这个mongoDB聚合转换成Spring数据mongo吗? 我试图在每个邀请函文件中获得未提醒与会者的电子邮件列表。 让它在mongo shell中运行,但需要在Spring data mongo中运行。 我的shell查询 ) 正如你们所看到的,这是我提出的,它在管道的项目和团队运作中并没有像预期的那样发挥作用。下面给出了生成的查询。 聚合对象创建 它创建以下查询 聚合对象生成的查询

  • >[danger] 注意!!! 使用聚合功能时,必须给它一个别名,以便能够从模型中访问它 > 聚合函数的计算,都是排除了 null 值,所以COUNT( id ) 一般推荐用非空的主键来计算 COUNT 计算数量 const { Sequelize } = app; // 查询班级总人数,按照姓名聚合 const ret = await Student.findAll({ attribut

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 方法 说明 count 统计数量,参数是要统计的字段名(可选) max 获取最大值,参数是要统计的字段名(必须) min 获取最小值,参数是要统计的字段名(必须) avg 获取平均值,参数是要统计的字段名(必须) sum

  • 我第一次使用mongo。我正在尝试使用下面的查询聚合集合中的一些文档。相反,查询返回一个具有键“result”的对象,该键包含一个包含符合$match的所有文档的数组。 下面是查询。 以下是集合中的示例文档: 我正在尝试将所有内容按uid进行分组,每个组的总和。。。实现这一目标的正确方法是什么?