我试图在MongoDB中查询多个子文档,并作为一个文档返回。我认为聚合框架是可行的,但是,我看不出它是正确的。
请输入以下文档:
{
"board_id": "1",
"hosts":
[{
"name": "bob",
"ip": "10.1.2.3"
},
{
"name": "tom",
"ip": "10.1.2.4"
}]
}
{
"board_id": "2",
"hosts":
[{
"name": "mickey",
"ip": "10.2.2.3"
},
{
"name": "mouse",
"ip": "10.2.2.4"
}]
}
{
"board_id": "3",
"hosts":
[{
"name": "pavel",
"ip": "10.3.2.3"
},
{
"name": "kenrick",
"ip": "10.3.2.4"
}]
}
试图获得如下查询结果:
{
"hosts":
[{
"name": "bob",
"ip": "10.1.2.3"
},
{
"name": "tom",
"ip": "10.1.2.4"
},
{
"name": "mickey",
"ip": "10.2.2.3"
},
{
"name": "mouse",
"ip": "10.2.2.4"
},
{
"name": "pavel",
"ip": "10.3.2.3"
},
{
"name": "kenrick",
"ip": "10.3.2.4"
}]
}
我试过这个:
db.collection.aggregate([ { $unwind: '$hosts' }, { $project : { name: 1, hosts: 1, _id: 0 }} ])
但这不是我想要的。
发布于 2016-02-06 02:10:54
你绝对可以用聚合来做这件事。让我们假设您的数据在集合中,名为board,所以请用您的集合名替换它。
db.board.aggregate([
{$unwind:"$hosts"},
{$group:{_id:null, hosts:{$addToSet:"$hosts"}}},
{$project:{_id:0, hosts:1}}
]).pretty()
它会回来的
{
"hosts" : [
{
"name" : "kenrick",
"ip" : "10.3.2.4"
},
{
"name" : "pavel",
"ip" : "10.3.2.3"
},
{
"name" : "mouse",
"ip" : "10.2.2.4"
},
{
"name" : "mickey",
"ip" : "10.2.2.3"
},
{
"name" : "tom",
"ip" : "10.1.2.4"
},
{
"name" : "bob",
"ip" : "10.1.2.3"
}
]
}
发布于 2016-02-06 02:10:03
因此,这里的基本问题是数组包含在单独的文档中。因此,虽然您正确地将数组用于处理,但为了将内容带入单个数组,您需要跨文档对结果进行$unwind
,并将内容$push
到结果数组:
db.collection.aggregate([
{ "$unwind": "$hosts" },
{ "$group": {
"_id": null,
"hosts": { "$push": "$hosts" }
}}
])
因此,正如$unwind
将“解构”数组元素一样,$group
中的$push
累加器将“重构”数组。而且,由于没有"group“on的其他键,所以这会将所有元素都带到一个数组中。
请注意,只有当生成的文档不超过BSON限制时,null
分组键才是真正实用的。否则,最好将各个元素作为文档保留在文档中。
如果需要,可以选择使用附加的_id
删除$project
。
https://stackoverflow.com/questions/35236398
复制相似问题