如何 $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,而不是解析所有字段。
我该怎么做?
$set
- 创建新字段 total
以求和 a
和 b
.
$group
- 按 null
分组,表示对所有 total
求和并将文档添加到 items
数组中。
使用 $$ROOT
它将添加整个文档。
items: {
$push: "$ROOT"
}
如果您只需要一些字段,请指定(所需的)文档模式。
items: {
$push: {
A: "$a",
B: "$b"
}
}
$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"
}
])
我在聚合管道的第一阶段有这个结果数组,使用 $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,而不是解析所有字段。
我该怎么做?
$set
- 创建新字段total
以求和a
和b
.$group
- 按null
分组,表示对所有total
求和并将文档添加到items
数组中。
使用 $$ROOT
它将添加整个文档。
items: {
$push: "$ROOT"
}
如果您只需要一些字段,请指定(所需的)文档模式。
items: {
$push: {
A: "$a",
B: "$b"
}
}
$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"
}
])