【问题标题】:Convert string to number and count sum of values in an array in mongodb将字符串转换为数字并计算mongodb中数组中值的总和
【发布时间】:2020-06-10 13:26:27
【问题描述】:

我想用数组中的类型字符串对总金额求和,所以我在 mongo 中写了这个。请帮忙

试过了:

db.compte.aggregate([
 {$project:{
   account: "$auditMessages.eventMetaData.Counterparty Name",
   amount: "$auditMessages.eventMetaData.Transaction Amount",
   "total": {$sum:"$amount"}
 }}])

结果:

{
"_id" : ObjectId("5ed638e566a699750cbb1b0f"),
"account" : [
  "Mr Jalel CHAHED",
  "Mr Jalel CHAHED",
  "Mr Jalel CHAHED",
  "Mr Jalel CHAHED"
 ],
"amount" :
 [ 
  "4.32",
  "4.32",
   "1.32",
   "1.32"
 ],
"total" : 0}

【问题讨论】:

  • 当前查询有什么问题?目前的结果是什么?预期的结果是什么?
  • 我想合计金额,总和是 11.28 (4.32+4.32+1.32+1.32) 但总数是 0
  • 这应该很容易,只需在这里按 id 或主列分组,然后对金额求和。您可能需要另一个管道。由于我们不知道compte 集合是什么样的,我们无法为这个问题提供任何具体的解决方案。
  • 我用了group by,同样的结果总共0

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您在$project 中创建amount 字段并在同一阶段使用它本身,这就是为什么它在"total": {$sum:"$amount"} 上返回0,而且$sum 似乎不使用数组。

假设您的文档如下所示:

{
    "auditMessages": {
      eventMetaData: [
        {
          "Counterparty Name": "Mr Jalel CHAHED",
          abc: 1,
          "Transaction Amount": "4.32"
        },
        {
          "Counterparty Name": "Mr Jalel CHAHED",
          abc: 11,
          "Transaction Amount": "4.32"
        },
        {
          "Counterparty Name": "Mr Jalel CHAHED",
          abc: 12,
          "Transaction Amount": "1.32"
        },
        {
          "Counterparty Name": "Mr Jalel CHAHED",
          abc: 122,
          "Transaction Amount": "1.32"
        }
      ]
    }
  }

因为auditMessages.eventMetaData 是一个数组,那么当你这样做时:

"$auditMessages.eventMetaData.Counterparty Name""$auditMessages.eventMetaData.Transaction Amount" 那么你得到的是一组值,就像你现在在结果中看到的一样。

查询:

db.collection.aggregate([
    {
      $project: {
        account: { $arrayElemAt: [ "$auditMessages.eventMetaData.Counterparty Name", 0 ] }, // get name from first element in array,use only if name is same in all objects
        total: {
          $reduce: {
            input: "$auditMessages.eventMetaData.Transaction Amount", // Iterate on array
            initialValue: 0,
            in: { $trunc: [ { $add: [ "$$value", { $toDouble: "$$this" } ] }, 2 ] } // convert string to double, sum-up & truncate to 2 digits
          }
        }
      }
    }
  ])

测试: mongoplayground

参考: aggregation

【讨论】:

  • 如何获得一个名字,例如名字 Mr Jalel CHAHED,总数是 4,谢谢!
  • @m1h3r:没明白你的意思!
猜你喜欢
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多