【问题标题】:combine array fields into a single array field mongo将数组字段组合成一个数组字段 mongo
【发布时间】:2026-01-17 13:45:01
【问题描述】:

我使用的是 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"

}

我想将 WorkProfile 和 AdditionalSkills 下的所有技能组合在 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()

但我得到以下输出 -

{
    "_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")
    ]

}

如何修复 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()

【问题讨论】:

  • 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()

标签: arrays mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以使用$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"]}
        }
    }
])

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

【讨论】:

  • 嘿,我怎样才能在我的最终“JobSkills”数组中获得不同的 objectIds
  • @AnuragSharma 只使用 $setUnion 而不是 $concatArrays,它只是忽略重复项
  • jira.mongodb.org/browse/SERVER-31991 的一个很好的解决方法。你可以把它贴在那里。