具有数组对象值总和的MongoDB聚合

时间:2020-07-08 14:51:56

标签: node.js mongodb mongodb-query

我有一个包含以下数据的集合:

{ "id": 1,
  "name": "abc",
  "age" : "12"
  "quizzes": [
      {
          "id": "1",
          "time": "10"
      },
      {
          "id": "2",
          "time": "20"
      }
  ]
},
{ "id": 2,
  "name": "efg",
  "age" : "20"
  "quizzes": [
      {
          "id": "3",
          "time": "11"
      },
      {
          "id": "4",
          "time": "25"
      }
  ]
},
...

我想对每个文档的总和进行MongoDB聚合,并将其设置为totalTimes字段

这是查询后我想要得到的结果:

{ "id": 1,
  "name": "abc",
  "age" : "12",
  "totalTimes": "30"
  "quizzes": [
      {
          "id": "1",
          "time": "10"
      },
      {
          "id": "2",
          "time": "20"
      }
  ]
},
{ "id": 2,
  "name": "efg",
  "age" : "20",
  "totalTimes": "36"
  "quizzes": [
      {
          "id": "3",
          "time": "11"
      },
      {
          "id": "4",
          "time": "25"
      }
  ]
},
...

如何查询以获得测验时间总和?

1 个答案:

答案 0 :(得分:3)

使用$reduce

非常简单
db.collection.aggregate([
  {
    $addFields: {
      totalTimes: {
        $reduce: {
          input: "$quizzes",
          initialValue: 0,
          in: {
            $sum: [
              {
                $toInt: "$$this.time"
              },
              "$$value"
            ]
          }
        }
      }
    }
  }
])

Mongo Playground