我正在尝试查询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 }} ])
但这不是我想要的。
答案 0 :(得分:1)
所以你的基本问题是数组包含在不同的文档中。因此,虽然您对要处理的数组$unwind
是正确的,但为了将内容整合到一个数组中,您需要$group
跨文档的结果,并$push
将内容添加到文档中结果数组:
db.collection.aggregate([
{ "$unwind": "$hosts" },
{ "$group": {
"_id": null,
"hosts": { "$push": "$hosts" }
}}
])
正如$unwind
将"解构"数组元素,$push
中的$group
累加器带来"重建"数组。而且因为没有其他关键的" group" on,这会将所有元素组合成一个数组。
请注意,null
分组键仅在结果文档不超过BSON限制时才真正实用。否则,最好将各个元素作为文档保留。
如果需要,可以选择删除_id
$project
。
答案 1 :(得分:1)
你绝对可以用聚合来做到这一点。我们假设您的数据位于名为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"
}
]
}