【问题标题】:$unwind 2 fields separately in mongodb query$unwind 2 字段分别在 mongodb 查询
【发布时间】:2017-06-28 11:04:40
【问题描述】:

我想$unwind 2 个字段,schoolhome。 数据库结构是这样的;

{ 
    "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",
        }, 
    ]
}

我想 $unwind schoolhome 字段并将它们中的每一个都设为;

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

我写的旨在获取上述格式的查询是;

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

query 是成对出现的;

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

我怎样才能分别$unwind 2 个字段,而不是这种结果对格式?

【问题讨论】:

  • 为什么要投反对票?这不是一个很好解释和直接的问题吗?还是已经回答了,重复?

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

这是不可能的。对于 MongoDB 3.4,有一个可能的解决方法。 $facet 可用于在同一文档的单个阶段中执行一组以上的管道操作。它对您的情况很有用。

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'
    }
})

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2013-03-15
    • 2013-11-03
    • 2016-03-17
    相关资源
    最近更新 更多