MongoDB 基于每个元素对来自多个文档的数组求和

标签 mongodb mongodb-query aggregation-framework

我有以下文档结构(针对此示例进行了简化)

{
  _id : ObjectId("sdfsdf"),
  result : [1, 3, 5, 7, 9]
},
{
  _id : ObjectId("asdref"),
  result : [2, 4, 6, 8, 10]
}

我想得到那些 result 数组的总和,但不是总和,而是一个新数组对应于基于元素的原始数组的总和,即

result : [3, 7, 11, 15, 19]

我在这里搜索了无数的问题,其中有一些很接近(例如 this onethis onethis one ),但我不太明白。

我可以得到每个数组的总和

aggregate(
    [
      {
        "$unwind" : "$result"
      },
      {
        "$group": {
          "_id": "$_id",
          "results" : { "$sum" : "$result"}
          }
      }
    ]
)

这给了我

[ { _id: sdfsdf, results: 25 },
  { _id: asdref, results: 30 } ]

但我不知道如何得到每个元素的总和

最佳答案

您可以使用 includeArrayIndex如果您有 3.2 或更高版本的 MongoDb。

那么你应该改变$unwind

你的代码应该是这样的:

.aggregate(
    [
      {
        "$unwind" :  { path: "$result", includeArrayIndex: "arrayIndex" }
      },
      {
        "$group": {
          "_id": "$arrayIndex",
          "results" : { "$sum" : "$result"}
          }
      },
      { 
        $sort: { "_id": 1}
      },
      {
        "$group":{
          "_id": null,
          "results":{"$push":"$results"}
          } 
      },
      {
        "$project": {"_id":0,"results":1}
      }
    ]
)

关于MongoDB 基于每个元素对来自多个文档的数组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35479563/

相关文章:

ios - Swift 中的数组到 JSON 数组

mongodb - Golang 和 MongoDB : DeleteMany with filter

mongodb - 使用圆作为区域的地理查询以匹配 MongoDB 中 MultiPoint 对象的至少一个点

mongodb - 蒙戈错误: The $cond accumulator is a unary operator

javascript - Mongoose - 如何在预(保存/更新)中间件中引发多个错误?

mongodb - 在填充中排序不起作用( Mongoose )

mongodb - 从文档中删除字段后,MongoDB 集合大小未更改

node.js - 为mongoose查找查询结果添加一个字段

javascript - 使用 mongodb 聚合如何减去持续时间

node.js - 使用 Mongoose 按值仅查找数组数组中的项目