如何 $push 聚合中的所有文档而不是特定字段

Raz*_*Raz 2 aggregation mongodb nosql aggregation-framework

我在聚合管道的第一阶段使用以下方法得到了这组结果$match

[
  { a: 1, b: 2 },
  { a: 3, b: 4 }
]
Run Code Online (Sandbox Code Playgroud)

现在我想对所有 A 和 B 求和,并且仍然保留它们,因此我将得到如下结果:

{
  total_sum: 10,
  items: [...] // first and second objects ofcourse
}
Run Code Online (Sandbox Code Playgroud)

我尝试过$group$push但是,push 只从对象中推送特定字段,我需要命名 A 和 B,而不是解析所有它们。

我该怎么做?

Yon*_*hun 6

  1. $set- 创建新字段total来求和ab
  2. $group- Group by ,表示将所有文档null相加并添加到数组中。totalitems

它将$$ROOT添加整个文档。

items: {
  $push: "$ROOT"
}
Run Code Online (Sandbox Code Playgroud)

如果您只需要某些字段,请指定(所需的)文档模式。

items: {
  $push: {
    A: "$a",
    B: "$b"
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. $unset(如果使用$push $$ROOT)- 从字段中删除total字段items
db.collection.aggregate([
  {
    $set: {
      total: {
        $sum: [
          "$a",
          "$b"
        ]
      }
    }
  },
  {
    $group: {
      _id: null,
      total_sum: {
        $sum: "$total"
      },
      items: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unset: "items.total"
  }
])
Run Code Online (Sandbox Code Playgroud)

示例 Mongo 游乐场