首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB展开2个嵌入式阵列

MongoDB展开2个嵌入式阵列
EN

Stack Overflow用户
提问于 2017-03-07 13:54:58
回答 2查看 177关注 0票数 1

我有一个关于MongoDB聚合查询的问题,它几乎与mongodb查询中的$unwind 2字段类似。

这是文件:

代码语言:javascript
复制
{
    "_id" : "1",
    "details" : {
        "phonenumber" : [
            "1",
            "2"
        ],
        "name" : [
            "a",
            "b"
        ]
    }
}

我正在尝试构建一个查询,该查询将返回以下结果:

代码语言:javascript
复制
{ "_id" : "1", "phonenumber" : "1", "name" : null },
{ "_id" : "1", "phonenumber" : "2", "name" : null },
{ "_id" : "1", "phonenumber" : null, "name" : "a" },
{ "_id" : "1", "phonenumber" : null, "name" : "b" }

能帮我个忙吗?

我能找到的最接近的解决方案是通过以下查询:

代码语言:javascript
复制
db.document.aggregate( [ { $unwind: { path: "$details.name"} }, { $unwind: { path: "$details.phonenumber" } }, { $project: { _id: 1, name: "$details.name", phonenumber: "$details.phonenumber" } } ] )

上述查询的输出是:

代码语言:javascript
复制
{ "_id" : "1", "phonenumber" : "1", "name" : "a" },
{ "_id" : "1", "phonenumber" : "1", "name" : "b" },
{ "_id" : "1", "phonenumber" : "2", "name" : "a" },
{ "_id" : "1", "phonenumber" : "2", "name" : "b" }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-07 15:31:27

对于MongoDB v3.4,可能的解决方案之一是,

代码语言:javascript
复制
db.document.aggregate({
    '$facet': {
        'phonenumber': [{
            '$unwind': '$details.phonenumber'
        }, {
            '$project': {
                phonenumber: '$details.phonenumber',
                name: null
            }
        }],
        'name': [{
            '$unwind': '$details.name'
        }, {
            '$project': {
                name: '$details.name',
                phonenumber: null
            }
        }]
    }
}, {
    '$project': {
        'combined': {
            '$setUnion': ['$phonenumber', '$name']
        }
    }
}, {
    '$unwind': '$combined'
}, {
    '$replaceRoot': {
        'newRoot': '$combined'
    }
})

小面允许我们在一个阶段中包含多个聚合管道,这可以从版本3.4中获得。

票数 2
EN

Stack Overflow用户

发布于 2017-03-07 18:20:37

mongodb早期版本的替代解决方案,

代码语言:javascript
复制
    db.document.aggregate([{
        $unwind: {
            path: "$details.name"
        }
    }, {
        $group: {
            _id: "$_id",
            nameArr: {
                $push: {
                    name: "$details.name",
                    phonenumber: {
                        $ifNull: ["$description", null]
                    }
                }
            },
            "details": {
                $first: "$details"
            }
        }
    }, {
        $unwind: "$details.phonenumber"
    }, {
        $group: {
            _id: "$_id",
            phoneArr: {
                $push: {
                    phonenumber: "$details.phonenumber",
                    name: {
                        $ifNull: ["$description", null]
                    }
                }
            },
            "nameArr": {
                $first: "$nameArr"
            }
        }
    }, {
        $project: {
            _id: 1,
            value: {
                $setUnion: ["$nameArr", "$phoneArr"]
            }
        }
    }, {
        $unwind: "$value"
    }, {
        $project: {
            name: "$value.name",
            phonenumber: "$value.phonenumber"
        }
    }])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42650172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档