mongoDB:聚合动态/多个字段

时间:2016-01-11 07:53:44

标签: javascript mongodb

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

{
    "_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,但这并没有真正帮助。我想使用完整内容并添加字段typeparent

结果

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

1 个答案:

答案 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数组值。