通过Mongo聚合管道将对象数组中的字段相乘

时间:2020-05-19 08:34:45

标签: mongodb aggregation-framework

给出以下记录:

{
  "_id": "5ebe47995dc5b683d050c396",
  "date": "2020-05-05 00:00:00",
  "insertTime": "2020-05-15 15:41:13.039000",
  "resultSummary": {
    "total": [
      {
        "date": "2019-09-12 00:00:00",
        "actualCost": 123,
      },
      {
        "date": "2019-09-13 00:00:00",
        "actualCost": 456,
      }
    ]
  }
}

我想使用Mongo聚合将actualCost乘以100。

预期结果:

{
  "_id": "5ebe47995dc5b683d050c396",
  "date": "2020-05-05 00:00:00",
  "insertTime": "2020-05-15 15:41:13.039000",
  "resultSummary": {
    "total": [
      {
        "date": "2019-09-12 00:00:00",
        "actualCost": 12300,
      },
      {
        "date": "2019-09-13 00:00:00",
        "actualCost": 45600,
      }
    ]
  }
}

我尝试过的事情:

{'$set':
     {'resultSummary.total.actualCost': {'$multiply': ['$resultSummary.total.$.actualCost', 100]},
     }
}

但是Mongo似乎无法识别$并给出

Error: FieldPath field names may not start with '$'

1 个答案:

答案 0 :(得分:0)

由于resultSummary.totalarray,因此我们无法应用$multiply运算符。而是使用$map运算符并分别应用乘法。

尝试这个:

db.collection.aggregate([
  {
    $addFields: {
      resultSummary: {
        total: {
          $map: {
            input: "$resultSummary.total",
            as: "total",
            in: {
              "date": "$$total.date",
              "actualCost": {
                $multiply: [
                  "$$total.actualCost",
                  100
                ]
              }                  
            }
          }
        }
      }
    }
  }
])

MongoPlayground