如何在 MongoDB 中的 $group 中创建嵌套数组?
How to create nested array inside $group in MongoDB?
经过一些聚合管道阶段后,我的 MongoDB 文档具有以下格式:
{
"key": "A",
"status": "To Do",
"val": 4
},
{
"key": "A",
"status": "Done",
"val": 1
},
{
"key": "A",
"status": "To Do",
"val": 3
},
{
"key": "A",
"status": "Done",
"val": 2
},
{
"key": "B",
"status": "Done",
"val": 5
},
{
"key": "B",
"status": "Done",
"val": 6
}
预期输出:
- 分组依据
key
- 分组依据
status
- 推送
val
{
"key": "A",
"status_val": [
{
"status": "To Do",
"val": [
3,
4
]
},
{
"status": "Done",
"val": [
1,
2
]
}
]
},
{
"key": "B",
"status_val": "Done",
"val": [
5,
6
]
}
这是我尝试过的:
db.collection.aggregate([
{
$group: {
_id: {
key:"$key",
status:"$status"
},
v: {
$push: "$val"
}
}
},
{
$group: {
_id: "$_id.key",
status_val: {
$addToSet: {
status: "$_id.status",
val: "$_id.v"
}
}
}},
{
$project: { _id: 0,key:"$_id",status_val:1 }
}
]).pretty()
但是我得到了错误的输出:
[
{
"key": "B",
"status_val": [
{
"status": "Done"
}
]
},
{
"key": "A",
"status_val": [
{
"status": "Done"
},
{
"status": "To Do"
}
]
}
]
如何在 $group
中获取嵌套数组?
你正确 运行 $group
两次,但需要更改此行:
val: "$_id.v"
v
不是 _id
的一部分,第一个 $group
之后的数据如下所示:
{
"_id": { "key": "B, "status": "Done" },
"v": [ 5, 6 ]
}
尝试:
db.collection.aggregate([
{
$group: {
_id: { key: "$key", status: "$status" },
val: { $push: "$val" }
}
},
{
$group: {
_id: "$_id.key",
status_val: {
$push: {
status: "$_id.status",
val: "$val"
}
}
}
},
{
$project: {
_id: 0,
key: "$_id",
status_val: 1
}
}
])
经过一些聚合管道阶段后,我的 MongoDB 文档具有以下格式:
{
"key": "A",
"status": "To Do",
"val": 4
},
{
"key": "A",
"status": "Done",
"val": 1
},
{
"key": "A",
"status": "To Do",
"val": 3
},
{
"key": "A",
"status": "Done",
"val": 2
},
{
"key": "B",
"status": "Done",
"val": 5
},
{
"key": "B",
"status": "Done",
"val": 6
}
预期输出:
- 分组依据
key
- 分组依据
status
- 推送
val
{
"key": "A",
"status_val": [
{
"status": "To Do",
"val": [
3,
4
]
},
{
"status": "Done",
"val": [
1,
2
]
}
]
},
{
"key": "B",
"status_val": "Done",
"val": [
5,
6
]
}
这是我尝试过的:
db.collection.aggregate([
{
$group: {
_id: {
key:"$key",
status:"$status"
},
v: {
$push: "$val"
}
}
},
{
$group: {
_id: "$_id.key",
status_val: {
$addToSet: {
status: "$_id.status",
val: "$_id.v"
}
}
}},
{
$project: { _id: 0,key:"$_id",status_val:1 }
}
]).pretty()
但是我得到了错误的输出:
[
{
"key": "B",
"status_val": [
{
"status": "Done"
}
]
},
{
"key": "A",
"status_val": [
{
"status": "Done"
},
{
"status": "To Do"
}
]
}
]
如何在 $group
中获取嵌套数组?
你正确 运行 $group
两次,但需要更改此行:
val: "$_id.v"
v
不是 _id
的一部分,第一个 $group
之后的数据如下所示:
{
"_id": { "key": "B, "status": "Done" },
"v": [ 5, 6 ]
}
尝试:
db.collection.aggregate([
{
$group: {
_id: { key: "$key", status: "$status" },
val: { $push: "$val" }
}
},
{
$group: {
_id: "$_id.key",
status_val: {
$push: {
status: "$_id.status",
val: "$val"
}
}
}
},
{
$project: {
_id: 0,
key: "$_id",
status_val: 1
}
}
])