在 MongoDB 聚合中避免空花括号
Avoiding Empty Curly Braces in MongoDB Aggregation
我正在尝试通过 react chartjs 显示 mongodb 聚合结果。我的部分问题是我没有在后端实现正确的聚合输出。
当前聚合输出,其中包含不需要的空花括号
[{
"_id":"Fubar",
"A_set":[{"A":"Y"},{"A":"N"},{},{}],
"A_count_set":[{"A_count":1},{"A_count":1},{},{}],
"B_set":[{},{},{"B":"N"},{"B":"Y"}],
"B_count_set":[{},{},{"B_count":1},{"B_count":1}]},
{
"_id":"Fubar2",
"A_set":[{"A":"Y"},{"A":"N"},{},{}],
"A_count_set":[{"A_count":1},{"A_count":1},{},{}],
"B_set":[{},{},{"B":"N"},{"B":"Y"}],
"B_count_set":[{},{},{"B_count":1},{"B_count":1}]
}]
我正在努力实现这个目标聚合输出,它缺少空花括号
[{
"_id":"Fubar",
"A_set":[{"A":"Y"},{"A":"N"}],
"A_count_set":[{"A_count":1},{"A_count":1}],
"B_set":[{"B":"N"},{"B":"Y"}],
"B_count_set":[{"B_count":1},{"B_count":1}]},
{
"_id":"Fubar2",
"A_set":[{"A":"Y"},{"A":"N"}],
"A_count_set":[{"A_count":1},{"A_count":1}],
"B_set":[{"B":"N"},{"B":"Y"}],
"B_count_set":[{"B_count":1},{"B_count":1}]
}]
管道操作
{$facet: {
A_branch: [
{$group: {
_id: {
Q_id: "$A_id",
A_id: "$A_id"
},
A_count: {$sum: 1}
}}
],
B_branch: [
{$group: {
_id: {
Q_id: "$Q_id",
B_id: "$B_id"
},
B_count: {$sum: 1}
}}
]
}},
{$project: {
combined_group: {$setUnion: ['$A_branch','$B_branch']}
}},
{$unwind: '$combined_group'},
{$lookup:
{
from: "Q",
localField: "combined_group._id.Q_id",
foreignField: "_id",
as: "QRef"
}
},
{$unwind: "$QRef" },
{$lookup:
{
from: "A",
localField: "combined_group._id.A_id",
foreignField: "_id",
as: "ARef"
}
},
{$unwind: {path:"$ARef", preserveNullAndEmptyArrays: true} },
{$lookup:
{
from: "B",
localField: "combined_group._id.B_id",
foreignField: "_id",
as: "BRef"
}
},
{$unwind: {path:"$BRef", preserveNullAndEmptyArrays: true} },
{$group: {
_id: "$QRef.text",
A_set: {
$push: {
A: "$ARef.value"
}
},
A_count_set: {
$push: {
A_count: "$combined_group.A_count"
}
},
B_set: {
$push: {
B: "$BRef.value"
}
},
B_count_set: {
$push: {
B_count: "$combined_group.B_count"
}
}
}}
聚合输入
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
在管道末尾使用$filter
db.collection.aggregate([
{
"$set": {
"A_set": {
"$filter": {
"input": "$A_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
},
{
"$set": {
"A_count_set": {
"$filter": {
"input": "$A_count_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
},
{
"$set": {
"B_set": {
"$filter": {
"input": "$B_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
},
{
"$set": {
"B_count_set": {
"$filter": {
"input": "$B_count_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
}
])
我正在尝试通过 react chartjs 显示 mongodb 聚合结果。我的部分问题是我没有在后端实现正确的聚合输出。
当前聚合输出,其中包含不需要的空花括号
[{
"_id":"Fubar",
"A_set":[{"A":"Y"},{"A":"N"},{},{}],
"A_count_set":[{"A_count":1},{"A_count":1},{},{}],
"B_set":[{},{},{"B":"N"},{"B":"Y"}],
"B_count_set":[{},{},{"B_count":1},{"B_count":1}]},
{
"_id":"Fubar2",
"A_set":[{"A":"Y"},{"A":"N"},{},{}],
"A_count_set":[{"A_count":1},{"A_count":1},{},{}],
"B_set":[{},{},{"B":"N"},{"B":"Y"}],
"B_count_set":[{},{},{"B_count":1},{"B_count":1}]
}]
我正在努力实现这个目标聚合输出,它缺少空花括号
[{
"_id":"Fubar",
"A_set":[{"A":"Y"},{"A":"N"}],
"A_count_set":[{"A_count":1},{"A_count":1}],
"B_set":[{"B":"N"},{"B":"Y"}],
"B_count_set":[{"B_count":1},{"B_count":1}]},
{
"_id":"Fubar2",
"A_set":[{"A":"Y"},{"A":"N"}],
"A_count_set":[{"A_count":1},{"A_count":1}],
"B_set":[{"B":"N"},{"B":"Y"}],
"B_count_set":[{"B_count":1},{"B_count":1}]
}]
管道操作
{$facet: {
A_branch: [
{$group: {
_id: {
Q_id: "$A_id",
A_id: "$A_id"
},
A_count: {$sum: 1}
}}
],
B_branch: [
{$group: {
_id: {
Q_id: "$Q_id",
B_id: "$B_id"
},
B_count: {$sum: 1}
}}
]
}},
{$project: {
combined_group: {$setUnion: ['$A_branch','$B_branch']}
}},
{$unwind: '$combined_group'},
{$lookup:
{
from: "Q",
localField: "combined_group._id.Q_id",
foreignField: "_id",
as: "QRef"
}
},
{$unwind: "$QRef" },
{$lookup:
{
from: "A",
localField: "combined_group._id.A_id",
foreignField: "_id",
as: "ARef"
}
},
{$unwind: {path:"$ARef", preserveNullAndEmptyArrays: true} },
{$lookup:
{
from: "B",
localField: "combined_group._id.B_id",
foreignField: "_id",
as: "BRef"
}
},
{$unwind: {path:"$BRef", preserveNullAndEmptyArrays: true} },
{$group: {
_id: "$QRef.text",
A_set: {
$push: {
A: "$ARef.value"
}
},
A_count_set: {
$push: {
A_count: "$combined_group.A_count"
}
},
B_set: {
$push: {
B: "$BRef.value"
}
},
B_count_set: {
$push: {
B_count: "$combined_group.B_count"
}
}
}}
聚合输入
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
{
"_id" : ObjectId("618..."),
"Q_id" : ObjectId("618..."),
"B_id" : ObjectId("618..."),
"A_id" : ObjectId("618...")
}
在管道末尾使用$filter
db.collection.aggregate([
{
"$set": {
"A_set": {
"$filter": {
"input": "$A_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
},
{
"$set": {
"A_count_set": {
"$filter": {
"input": "$A_count_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
},
{
"$set": {
"B_set": {
"$filter": {
"input": "$B_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
},
{
"$set": {
"B_count_set": {
"$filter": {
"input": "$B_count_set",
"as": "x",
"cond": { "$ne": [ "$$x", {}] }
}
}
}
}
])