MongoDB: 如何在聚合管道中将所有文档合并为单个文档
MongoDB: How to merge all documents into a single document in an aggregation pipeline
我的当前聚合输出如下:
[
{
"courseCount": 14
},
{
"registeredStudentsCount": 1
}
]
该数组有两个文档。我想将所有文档组合成一个文档,其中包含 mongoDB
中的所有字段
{
$group: {
"_id": "null",
data: {
$push: "$$ROOT"
}
}
}
当你将其添加为最后一个管道时,它会将所有文档放在数据下,但这里的数据将是一个对象数组。
你的情况是
{ "data":[
{
"courseCount": 14
},
{
"registeredStudentsCount": 1
}
] }
另一种方法是,
db.collection.aggregate([
{
$group: {
"_id": "null",
f: {
$first: "$$ROOT",
},
l: {
$last: "$$ROOT"
}
}
},
{
"$project": {
"output": {
"courseCount": "$f.courseCount",
"registeredStudentsCount": "$l.registeredStudentsCount"
},
"_id": 0
}
}
])
它不像第一个那样动态。由于您有两个文档,因此可以使用这种方法。它输出
[
{
"output": {
"courseCount": 14,
"registeredStudentsCount": 1
}
}
]
在第二种方法中使用额外的管道
{
"$replaceRoot": {
"newRoot": "$output"
}
}
你会得到输出
[
{
"courseCount": 14,
"registeredStudentsCount": 1
}
]
db.collection.aggregate([
{
$group: {
_id: 0,
merged: {
$push: "$$ROOT"
}
}
},
{
$replaceRoot: {
newRoot: {
"$mergeObjects": "$merged"
}
}
}
])
解释:
- 使用推送将输出文档分组在一个字段中
- 用合并的对象替换文档根目录
我的当前聚合输出如下:
[
{
"courseCount": 14
},
{
"registeredStudentsCount": 1
}
]
该数组有两个文档。我想将所有文档组合成一个文档,其中包含 mongoDB
中的所有字段{
$group: {
"_id": "null",
data: {
$push: "$$ROOT"
}
}
}
当你将其添加为最后一个管道时,它会将所有文档放在数据下,但这里的数据将是一个对象数组。
你的情况是
{ "data":[
{
"courseCount": 14
},
{
"registeredStudentsCount": 1
}
] }
另一种方法是,
db.collection.aggregate([
{
$group: {
"_id": "null",
f: {
$first: "$$ROOT",
},
l: {
$last: "$$ROOT"
}
}
},
{
"$project": {
"output": {
"courseCount": "$f.courseCount",
"registeredStudentsCount": "$l.registeredStudentsCount"
},
"_id": 0
}
}
])
它不像第一个那样动态。由于您有两个文档,因此可以使用这种方法。它输出
[
{
"output": {
"courseCount": 14,
"registeredStudentsCount": 1
}
}
]
在第二种方法中使用额外的管道
{
"$replaceRoot": {
"newRoot": "$output"
}
}
你会得到输出
[
{
"courseCount": 14,
"registeredStudentsCount": 1
}
]
db.collection.aggregate([
{
$group: {
_id: 0,
merged: {
$push: "$$ROOT"
}
}
},
{
$replaceRoot: {
newRoot: {
"$mergeObjects": "$merged"
}
}
}
])
解释:
- 使用推送将输出文档分组在一个字段中
- 用合并的对象替换文档根目录