将数组字段组合成单个数组字段 mongo

Anu*_*rma 4 arrays mongodb mongodb-query aggregation-framework

我正在使用 mongo 版本 3.4.3,我的文档存储在 mongo 中,如下所示 -

{
    "_id" : ObjectId("5ad5ab8aaf2808b739ba6ab2"),
    "ResumeId" : "105839064",
    "ResumeDetails" : {

            "WorkProfile" : [
                    {
                            "Company" : "XXXXXXXXX",
                            "JobTitle" : "YYYYY",
                            "JobSkills" : {
                                "CommonSkills": [],
                                "OtherSkills": []
                            }
                    },
                    {
                            "Company" : "XXXXXXXX",
                            "JobTitle" : "YYYYYY",
                            "JobSkills" : {
                                    "CommonSkills" : [
                                            ObjectId("5ad5ab860b94c96c738e914a")
                                    ],
                                    "OtherSkills" : [
                                            ObjectId("5ad5ab860b94c96c738e9146")
                                    ]
                            }
                    },
                    {
                            "Company" : "XXXXXXX",
                            "JobTitle" : "YYYY"
                    }
            ],
            "AdditionalSkills" : {
                    "CommonSkills" : [
                            ObjectId("5ad5ab860b94c96c738e9175"),
                            ObjectId("5ad5ab860b94c96c738e91f0"),
                            ObjectId("5ad5ab860b94c96c738e9241"),
                            ObjectId("5ad5ab860b94c96c738e919b")
                    ],
                    "OtherSkills" : [
                            ObjectId("5ad5ab860b94c96c738e90e6"),
                            ObjectId("5ad5ab860b94c96c738e9142"),
                            ObjectId("5ad5ab860b94c96c738e9211"),
                            ObjectId("5ad5ab860b94c96c738e9293"),
                            ObjectId("5ad5ab860b94c96c738e92c8")
                    ]
            }
    },
    "DocId" : "51cb2f49-fcb9-46a0-9040-67e0f986be11"
Run Code Online (Sandbox Code Playgroud)

}

我想将 WorkProfile 和 AnotherSkills 下的所有技能合并到 2 个单独的数组下。我尝试了以下查询

db.ResumeParsedData.aggregate([
{$match: {'DocId': '51cb2f49-fcb9-46a0-9040-67e0f986be11'}},
{$project: {
        'JobSkills': {'$concatArrays': [
            '$ResumeDetails.WorkProfile.JobSkills.CommonSkills', '$ResumeDetails.WorkProfile.JobSkills.OtherSkills']
        },
        'AdditionalSkills': {'$setUnion': [
            '$ResumeDetails.AdditionalSkills.CommonSkills', '$ResumeDetails.AdditionalSkills.OtherSkills']},
    }
}]).pretty()
Run Code Online (Sandbox Code Playgroud)

但我得到以下输出 -

{
    "_id" : ObjectId("5ad5ab8aaf2808b739ba6ab2"),
    "JobSkills" : [
            [
                    ObjectId("5ad5ab860b94c96c738e914a")
            ],
            [
                    ObjectId("5ad5ab860b94c96c738e9146")
            ]
    ],
    "AdditionalSkills" : [
            ObjectId("5ad5ab860b94c96c738e90e6"),
            ObjectId("5ad5ab860b94c96c738e9142"),
            ObjectId("5ad5ab860b94c96c738e9175"),
            ObjectId("5ad5ab860b94c96c738e919b"),
            ObjectId("5ad5ab860b94c96c738e91f0"),
            ObjectId("5ad5ab860b94c96c738e9211"),
            ObjectId("5ad5ab860b94c96c738e9241"),
            ObjectId("5ad5ab860b94c96c738e9293"),
            ObjectId("5ad5ab860b94c96c738e92c8")
    ]
Run Code Online (Sandbox Code Playgroud)

}

如何修复 JobSkills 数组字段。它目前作为数组字段的数组出现。

我还尝试了concatArrays以下两次:

db.ResumeParsedData.aggregate([ 
    {$match: {'DocId': '51cb2f49-fcb9-46a0-9040-67e0f986be11'}}, 
    {$project: { 
        'JobSkills': {'$concatArrays': { '$concatArrays': [ 
            '$ResumeDetails.WorkProfile.JobSkills.CommonSkills', 
            '$ResumeDetails.WorkProfile.JobSkills.OtherSkills'
        ]}}, 
        'AdditionalSkills': {'$setUnion': [ 
            '$ResumeDetails.AdditionalSkills.CommonSkills', 
            '$ResumeDetails.AdditionalSkills.OtherSkills'
        ]}, 
    } }
]).pretty()
Run Code Online (Sandbox Code Playgroud)

mic*_*ckl 8

您可以使用$reduce(在 3.4 中可用)来展平数组的数组:

db.ResumeParsedData.aggregate([
    { $match: {"DocId": "51cb2f49-fcb9-46a0-9040-67e0f986be11"} },
    {
        $project: {
            "JobSkills": {
                $reduce: {
                    input: {
                            $concatArrays: ["$ResumeDetails.WorkProfile.JobSkills.CommonSkills", "$ResumeDetails.WorkProfile.JobSkills.OtherSkills"]
                        },
                    initialValue: [],
                    in: { $setUnion: [ "$$this", "$$value" ] }
                }
            },
            "AdditionalSkills": {"$setUnion": [
                "$ResumeDetails.AdditionalSkills.CommonSkills", "$ResumeDetails.AdditionalSkills.OtherSkills"]}
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

$setUnion保证最终数组中不会有重复项