Ski*_*pm3 6 database mongodb nosql aggregation-framework
我有关于 MongoDB 的 unwind 操作符。
所以,我有这样的文件。
{
"name": "abc",
"report": {
"_2019": {
"May": {
"_9": {
"DATA": [{
"image": "xyz.png",
"object": true
},
{
"image": "abc.png",
"object": true
}
]
},
"_10": {
"DATA": [{
"image": "ejf.png",
"object": false
},
{
"image": "qwe.png",
"object": false
}
]
}
},
"June": {
"_1": {
"DATA": [{
"image": "jsk.png",
"object": false
}]
}
}
},
"_2020": {
"January": {
"_30": {
"DATA": [{
"image": "hhg.png",
"object": false
}]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并希望将输出格式化为这样的内容
[{
"image": "xyz.png",
"object": true
}, {
"image": "abc.png",
"object": true
}, {
"image": "ejf.png",
"object": false
}, {
"image": "qwe.png",
"object": false
}, {
"image": "jsk.png",
"object": false
}, {
"image": "hhg.png",
"object": false
}]
Run Code Online (Sandbox Code Playgroud)
我发现的第一件事是使用 unwind,但它只接受数组。第二个是在编程端使用 foreach。但我认为这并不有效。这可能吗?谢谢。
这里的问题是像_2020orJanuary或 之类的键_30是动态生成的。要从DATA级别访问子文档,您需要使用$objectToArray和$map从键值对中获取值。在每个步骤之后,您需要$unwind,然后在最后一步中,您可以运行$replaceRootDATA将文档从根级别提升:
db.col.aggregate([
{
$project: {
data: {
$map: {
input: { $objectToArray: "$report" },
in: "$$this.v"
}
}
}
},
{ $unwind: "$data" },
{
$project: {
data: {
$map: {
input: { $objectToArray: "$data" },
in: "$$this.v"
}
}
}
},
{ $unwind: "$data" },
{
$project: {
data: {
$map: {
input: { $objectToArray: "$data" },
in: "$$this.v"
}
}
}
},
{ $unwind: "$data" },
{ $unwind: "$data.DATA" },
{
$replaceRoot: {
newRoot: "$data.DATA"
}
}
])
Run Code Online (Sandbox Code Playgroud)