我需要将带有嵌套文档的集合转换为带有父引用的模型树结构。这就是我的结构的样子:
{
"_id" : "sdaGREsfRdfGdFdwG",
"docTitle" : "Document 1",
"group" : [
{
"id" : "cdPhkTpMXi8z6TqMT"
"title" : "title 1",
"data" : [
{
"id" : "Nkspf5kKfPo3axeJA",
"some" : "data",
"other" : "things",
"and" : "so on",
},
{
"id" : "vyjgkuNXRN9KkCd5o",
"some" : "data",
"any" : "thing",
}
],
},
{
"id" : "TuibXPe5qMvqdMW6q"
"title" : "title 2",
"data" : [
{
"id" : "f5L5zsSNRSQKWoAXL",
"some" : "data",
},
{
"id" : "Ca8ncFgq83RoeD8he",
"some" : "data",
"other" : "things",
},
],
}
]
}
要获取数据元素(group-elements的子元素),我这样做:
db.myCol.aggregate([{$unwind:"$group"},
{$unwind:"$group.data"},
{$project:{_id:"$group.data.id", some:"$group.data.some",
parent:"$group.id", type:{$literal:"element"}}}])
我的问题是获取数据对象的所有字段,因为每个元素的结构不同。由于内容是动态的,因此存在不同的字段或不同的字段数。在上面的代码中,我明确指出了字段same
,但这并没有真正帮助。我想使用完整内容并添加字段type
和parent
。
结果
{
"_id" : "Nkspf5kKfPo3axeJA",
"some" : "data",
"other" : "things",
"and" : "so on",
"type" : "element",
"parent" : "cdPhkTpMXi8z6TqMT"
},
{
"_id" : "vyjgkuNXRN9KkCd5o",
"some" : "data",
"any" : "thing",
},
{
"_id" : "f5L5zsSNRSQKWoAXL",
"some" : "data",
"type" : "element",
"parent" : "TuibXPe5qMvqdMW6q"
},
{
"_id" : "Ca8ncFgq83RoeD8he",
"some" : "data",
"other" : "things",
"type" : "element",
"parent" : "TuibXPe5qMvqdMW6q"
}
答案 0 :(得分:2)
根据您提出的问题,您提到您不知道data
元素的结构,因此将data
作为数组更改输出结构。在这里,我发布了答案但不完全是您的预期输出,但在聚合中使用$map解决了data
数组动态字段的问题。
db.myCol.aggregate({
"$project": {
"results": {
"$map": {
"input": "$group",
"as": "el",
"in": {
"parent": "$$el.id",
"type": {
"$literal": "element"
},
"data": "$$el.data"
}
}
}
}
}, {
"$unwind": "$results"
}, {
"$group": {
"_id": null,
"results": {
"$push": "$results"
}
}
}).pretty()
如果您unwind
之前group
再次{$wunwind:$results.data}
,那么您将获得所有data
数组值。