MongoDB分别展开2个嵌入式阵列

MongoDB分别展开2个嵌入式阵列,mongodb,Mongodb,我有一个关于MongoDB聚合查询的问题,它几乎类似于 文件如下: { "_id" : "1", "details" : { "phonenumber" : [ "1", "2" ], "name" : [ "a", "b" ] } } 我正在尝试构建一个查询,该查询将返回以下结果: { "_id" : "1",

我有一个关于MongoDB聚合查询的问题,它几乎类似于

文件如下:

{
    "_id" : "1",
    "details" : {
        "phonenumber" : [
            "1",
            "2"
        ],
        "name" : [
            "a",
            "b"
        ]
    }
}
我正在尝试构建一个查询,该查询将返回以下结果:

{ "_id" : "1", "phonenumber" : "1", "name" : null },
{ "_id" : "1", "phonenumber" : "2", "name" : null },
{ "_id" : "1", "phonenumber" : null, "name" : "a" },
{ "_id" : "1", "phonenumber" : null, "name" : "b" }
谁能帮我一下吗?

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

db.document.aggregate( [ { $unwind: { path: "$details.name"} }, { $unwind: { path: "$details.phonenumber" } }, { $project: { _id: 1, name: "$details.name", phonenumber: "$details.phonenumber" } } ] )
上述查询的输出为:

{ "_id" : "1", "phonenumber" : "1", "name" : "a" },
{ "_id" : "1", "phonenumber" : "1", "name" : "b" },
{ "_id" : "1", "phonenumber" : "2", "name" : "a" },
{ "_id" : "1", "phonenumber" : "2", "name" : "b" }

使用
MongoDB v3.4
,可能的解决方案之一是

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获得,这是早期版本mongodb的替代解决方案

    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"
        }
    }])

你能举一个你收藏的文件的完整例子吗?在您的尝试中,您有
$details.email
。聚合管道是按顺序进行的。一个阶段的输出将成为另一个阶段的输入。您试图做的是将初始数据分为两个阶段。那是不可能的ᵈˑ我已在问题中编辑了带有“姓名”的“电子邮件”字段。这是一个输入错误。@RaR是否可以通过其他方式获得我期望的输出?@AmitValse您使用的是哪个版本的MongoDB?