$unwind 2 fields separately in mongodb query

孤街浪徒 提交于 2019-12-23 12:26:37

问题


I want to $unwind 2 fields, school and home. database structure is like;

{ 
    "id" : 1,
    "school" : [
        {
            "path" : "school1", 
            "code" : "code1", 
        }, 
        {
            "path" : "school2", 
            "code" : "code2", 
        }, 
        {
            "path" : "school3", 
            "code" : "code3",
        }, 
        {
            "path" : "school4", 
            "code" : "code4",
        } 
    ], 
    "home" : [
         {
            "path" : "home1", 
            "code" : "homeCode1",
        }, 
        {
            "path" : "home2", 
            "code" : "homeCode2",
        }, 
    ]
}

I wanted to $unwind school and home fields and get each of them as;

{ 
    "id" : 1,
    "school" : [
        {
            "path" : "school1", 
            "code" : "code1", 
        }
},
{ 
    "id" : 1,
    "school" : [
       {
            "path" : "school2", 
            "code" : "code2", 
        }
},
{ 
    "id" : 1,
    "school" : [
       {
            "path" : "school3", 
            "code" : "code3", 
        }
},
{ 
    "id" : 1,
    "school" : [
       {
            "path" : "school4", 
            "code" : "code4", 
        }
},
{ 
    "id" : 1,
    "home" : [
       {
            "path" : "home1", 
            "code" : "homeCode1", 
        }
},
{ 
    "id" : 1,
    "home" : [
       {
            "path" : "home2", 
            "code" : "homeCode2", 
        }
}   

The query that I wrote which aims to get format above is;

db.collection.aggregate([
    {$unwind: "$school"},
    {$unwind: "$home"}
]).pretty()

But the query results as pairs;

{
    "id" : 1,
    "school" : {
        "path" : "school1",
        "code" : "code1"
    },
    "home" : {
        "path" : "home1",
        "code" : "homeCode1"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school1",
        "code" : "code1"
    },
    "home" : {
        "path" : "home2",
        "code" : "homeCode2"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school2",
        "code" : "code2"
    },
    "home" : {
        "path" : "home1",
        "code" : "homeCode1"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school2",
        "code" : "code2"
    },
    "home" : {
        "path" : "home2",
        "code" : "homeCode2"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school3",
        "code" : "code3"
    },
    "home" : {
        "path" : "home1",
        "code" : "homeCode1"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school3",
        "code" : "code3"
    },
    "home" : {
        "path" : "home2",
        "code" : "homeCode2"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school4",
        "code" : "code4"
    },
    "home" : {
        "path" : "home1",
        "code" : "homeCode1"
    }
}
{
    "id" : 1,
    "school" : {
        "path" : "school4",
        "code" : "code4"
    },
    "home" : {
        "path" : "home2",
        "code" : "homeCode2"
    }
}

How can I $unwind 2 fields separately, rather than this resulted pair format?


回答1:


It is not directly possible. With MongoDB 3.4 there is a possible workaround. $facet can be used to execute more than one set of pipeline operations in a single stage on the same document. It can be useful for your case.

db.collection.aggregate({
    '$facet': {
        'school': [{
            '$unwind': '$school'
        }, {
            '$project': {
                _id: '1',
                school: 1
            }
        }],
        'home': [{
            '$unwind': '$home'
        }, {
            '$project': {
                _id: '1',
                home: 1
            }
        }]
    }
}, {
    '$project': {
        'schoolAndHome': {
            '$setUnion': ['$school', '$home']
        }
    }
}, {
    '$unwind': '$schoolAndHome'
}, {
    '$replaceRoot': {
        'newRoot': '$schoolAndHome'
    }
})


来源:https://stackoverflow.com/questions/42153622/unwind-2-fields-separately-in-mongodb-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!