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

How to $push all of the document in aggregation instead of specific field?

我在聚合管道的第一阶段有这个结果数组,使用 $match:

[
  { a: 1, b: 2 },
  { a: 3, b: 4 }
]

现在我想对所有 A 和 B 求和并且仍然有它们,所以我将得到类似这样的结果:

{
  total_sum: 10,
  items: [...] // first and second objects ofcourse
}

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

我该怎么做?

  1. $set - 创建新字段 total 以求和 ab.
  2. $group - 按 null 分组,表示对所有 total 求和并将文档添加到 items 数组中。

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

items: {
  $push: "$ROOT"
}

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

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

Sample Mongo Playground