Javascript mongoDB:聚合动态/多个字段

Javascript mongoDB:聚合动态/多个字段,javascript,mongodb,Javascript,Mongodb,我需要将包含嵌套文档的集合转换为包含父引用的模型树结构。我的结构是这样的: { "_id" : "sdaGREsfRdfGdFdwG", "docTitle" : "Document 1", "group" : [ { "id" : "cdPhkTpMXi8z6TqMT" "title" : "title 1", "data" : [ {

我需要将包含嵌套文档的集合转换为包含父引用的模型树结构。我的结构是这样的:

{
    "_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",

                },
            ],

        }
    ]
}
要获取数据元素(它们是组元素的子元素),我执行以下操作:

db.myCol.aggregate([{$unwind:"$group"}, 
                {$unwind:"$group.data"}, 
                {$project:{_id:"$group.data.id", some:"$group.data.some", 
                           parent:"$group.id", type:{$literal:"element"}}}])
我的问题是当每个元素的结构不同时,获取数据对象的所有字段。由于内容是动态的,因此有不同的字段或不同数量的字段。在上面的代码中,我使用了显式的
字段,但这并没有真正的帮助。我想使用完整的内容并添加字段
type
parent

结果


根据您的问题,您提到您不知道
数据
元素的结构,因此要在数组更改输出结构时保留
数据
。在这里,我发布了答案,但它并不完全符合您的预期输出,而是解决了在聚合中使用
数据
数组动态字段的问题

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()
如果在
group
之前再次
展开
,如
{$wunwind:$results.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()