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