我有如下结构的MongoDB数据库记录。
{
"_id" : ObjectId("5dd569eb628243119cd933f5"),
"Name" : "Parent555",
"hash" : "Q2Nj1nGtGJCkHT6eygg1L0OrprQkhGd846fdd5",
"child_info" : {
"Name" : "Child_one",
"hash" : "2ac616b42d846fdd52002dc9ad7d810f9f8ce9",
"child_info" : {
"Name" : "Child_two",
"hash" : "5cd9119ae60a0a58d38999468648c371c50b7a"
}
}
}
有没有一种查询方式可以将所有的哈希值递归聚合成这样的结果?
{
"Parent555":{
"Q2Nj1nGtGJCkHT6eygg1L0OrprQkhGd846fdd5",
"2ac616b42d846fdd52002dc9ad7d810f9f8ce9",
"5cd9119ae60a0a58d38999468648c371c50b7a"
}
}
可能会有4、5个嵌套子,所以我对递归的方式很感兴趣。
请考虑我的意见。
我认为,如果你要使用这种模式的话,那么存储和检索文档就会很困难。不如用以下字段来存储文档
parent
,child
? 类似这样的?
{
"parentName" : "Parent555",
"hash" : "Q2Nj1nGtGJCkHT6eygg1L0OrprQkhGd846fdd5",
"childName" : "Child_one"
},
{
"parentName" : "Child_one",
"hash" : "2ac616b42d846fdd52002dc9ad7d810f9f8ce9",
"childName" : "Child_two"
},
{
"parentName" : "Child_two",
"hash" : "5cd9119ae60a0a58d38999468648c371c50b7a"
}
上面的模式对于检索和存储查询来说,是有些方便的,因为我们可能不会一直嵌套下去。如果,你是用你的模式绑定的,那么,这将对其他人有所帮助。
考虑到上面的集合。$graphLookup
会很有帮助。
db.collection.aggregate([
{
$graphLookup: {
from: "collection",
startWith: "$childName",
connectFromField: "childName",
connectToField: "parentName",
as: "child_hash"
}
},
{
$match: {
"parentName": "Parent555"
}
},
{
$project: {
parentName: 1,
hash: 1,
child_hash: {
$map: {
input: "$child_hash",
as: "c",
in: "$$c.hash"
}
}
}
}
])
产出: MongoPlayGroundLink
{
"_id": ObjectId("5a934e000102030405000000"),
"child_hash": [
"5cd9119ae60a0a58d38999468648c371c50b7a",
"2ac616b42d846fdd52002dc9ad7d810f9f8ce9"
],
"hash": "Q2Nj1nGtGJCkHT6eygg1L0OrprQkhGd846fdd5",
"parentName": "Parent555"
}