MongoDB将两个单独的字段分组为一个数组或具有相同字段名的内容

时间:2017-04-18 12:50:54

标签: mongodb distinct aggregation-framework

如果标题不具有描述性,我很抱歉,我不知道如何更好地表达我的问题。

我有一个包含此类数据的CD数据库:

{
"albumInfo": {
    "name": "Angels Fall First",
    "type": "LP",
    "genre": ["symphonic metal", "power metal", "folk metal"],
    "publicationYear": 1997,
    "tags":["tag1", "tag2", "tag3"],
    "stars": 4
},

"artist": {
    "name":"Nightwish",
    "members": [
        {
            "name": "Tarja Turunen",
            "instruments": ["lead vocals"]
        },
        {
            "name": "Tuomas Holopainen",
            "instruments": ["piano", "synthesizers", "keyboards", "vocals"]
        },
        {
            "name": "Erno Vuorinen",
            "instruments": ["guitar"]
        },
        {
            "name": "Jukka Nevalainen",
            "instruments": ["drums", "percussion"]
        }
    ]
},

"additionalArtists": [
    {
        "name": "Esa Lehtinen",
        "instruments": ["flutes"]
    }
]

我希望在一个数组中使用additionalArtists.name和artist.members.name,或者至少使它们具有相同的字段名称(例如" musician.name")以便我可以获取不同的音乐家来自数据库。

我想我的数据库格式不是很好但是这种奇怪的数据库现在应该这样做。

聚合$项目是我的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以使用$setUnion合并两个音乐家数组,并在单个文档中获取所有不同的musicians,然后$unwind,这样您就可以$group musicians使用$addToSet来区分所有文档。

db.collection.aggregate(
     { $project: { musician: { $setUnion: [ ["$artist.name"], "$additionalArtists.name" ] }, _id: 0 } },
     { $unwind: "$musician"},
     { $group: {_id:null , musician: {$addToSet:"$musician" } }}
)