【问题标题】:MongoDB aggregation sum values and group by propertyMongoDB 聚合总和值和按属性分组
【发布时间】:2022-01-26 09:23:45
【问题描述】:

我有一个看起来像这样的集合

{
 balance: string
 symbol: string
 address: string
}

我想使用如下聚合查询该集合:

input array addresses[]

查询集合,其中collection.address包含在提供的地址数组和SUM所有按符号分组的余额。

所需的输出应如下所示:

[
  {symbol: xy, balance: summedBalanceForThisSymbol},
  {symbol: yz, balance: summedBalanceForThisSymbol},
]

我对 mongoDB 比较陌生,这是我所拥有的,根本不起作用。

  const pipe = [
        {
            match: [
                {
                    address: { $in: addresses } //addresses is an array of string values
                }
            ]
        },
        {
            group: {
                objectId: "$symbol",
                balance: { $sum: "$balance" }
            }
        }
    ]

我必须使用 objectId 而不是 _id 因为我使用的 SDK 需要这样做。在求和之前,我还需要将字符串余额值转换为数字(我猜是两倍)。

【问题讨论】:

  • input array addresses[] 是什么意思?
  • 触发查询的函数有一个字符串数组类型的参数。
  • 重要的是要分离出与问题无关的任何内容以防止混淆。所以如果我理解你的话你想通过字符串数组过滤吗?也不清楚你到底在哪里挣扎(过滤或分组)
  • 我的示例聚合结构应该阐明我打算做什么,我也在最初的帖子中描述了我的目标。

标签: mongodb mongoose


【解决方案1】:

你很接近,你只是有一些小的语法错误,你应该这样做:

(需要提到的一点是这要求balance 是一个有效的数字字符串,否则管道会抛出错误)

db.collection.aggregate([
  {
    $match: {
      address: {
        $in: addresses
      }
    }
  },
  {
    $group: {
      _id: "$symbol",
      sum: {
        $sum: {
          "$toInt": "$balance"
        }
      }
    }
  }
])

Mongo Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多