我需要一点帮助,我尝试从嵌套数组中提取一些字段,但仍然很困难,有人可以帮忙吗?
这是示例文档:
[
{
_id: 1,
"_a": [
{
"_p": [
{
_pubId: {
"CC": "EN"
},
_prid: "2",
s: {
c: {
text: [
{
secId: "4"
},
{
secId: "5"
}
]
},
d: {
text: [
{
secId: "6"
},
{
secId: "7"
}
]
}
}
},
{
_pubId: {
"CC": "CZ"
},
_prid: "4",
s: {
c: {
text: [
{
secId: "8"
},
{
secId: "9"
}
]
}
}
}
]
},
{
"_p": [
{
_pubId: {
"CC": "CZ"
},
_prid: "200",
s: {
c: {
text: [
{
secId: "4"
},
{
secId: "5"
}
]
},
d: {
text: [
{
secId: "6"
},
{
secId: "7"
}
]
}
}
},
{
_pubId: {
"CC": "BG"
},
_prid: "4",
s: {
c: {
text: [
{
secId: "8"
},
{
secId: "9"
}
]
}
}
}
]
}
]
}
]
我需要仅为“_a._p._pubId.CC”:“EN”提取所有“_a._p.s.[d|c].text.secId”,输出需要如下所示:
_prid , secId
{ _prid:2 , secId:4 }
{ _prid:2 , secId:5 }
{ _prid:2 , secId:6 }
{ _prid:2 , secId:7 }
这非常丑陋,需要在更大的集合上进行测试,但这似乎输出了你想要的。
db.collection.aggregate([
{"$unwind": "$_a"},
{"$unwind": "$_a._p"},
{
"$match": {
"_a._p._pubId.CC": "EN"
}
},
{
"$group": {
"_id": "$_a._p._prid",
"pridOut": {
"$push": {
"$reduce": {
"input": {"$objectToArray": "$_a._p.s"},
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
{
"$reduce": {
"input": "$$this.v.text",
"initialValue": [],
"in": {"$concatArrays": ["$$value", ["$$this"]]}
}
}
]
}
}
}
}
}
},
{
"$set": {
"pridOut": {
"$reduce": {
"input": "$pridOut",
"initialValue": [],
"in": {"$setUnion": ["$$value", "$$this"]}
}
}
}
},
{
"$set": {
"pridOut": {
"$map": {
"input": "$pridOut",
"as": "eachSecId",
"in": {"$mergeObjects": [{"_prid": "$_id"}, "$$eachSecId"]}
}
}
}
},
{"$unwind": "$pridOut"},
{"$replaceWith": "$pridOut"}
])
使用您的样本集合进行输出:
[
{"_prid": "2", "secId": "4"},
{"_prid": "2", "secId": "5"},
{"_prid": "2", "secId": "6"},
{"_prid": "2", "secId": "7"}
]
在 mongoplayground.net 上尝试一下。