递归地从文档中获取值

问题描述 投票:0回答:1

我有如下结构的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个嵌套子,所以我对递归的方式很感兴趣。

database mongodb pymongo
1个回答
0
投票

请考虑我的意见。

我认为,如果你要使用这种模式的话,那么存储和检索文档就会很困难。不如用以下字段来存储文档 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"
}

MongoPlayGroundLink

© www.soinside.com 2019 - 2024. All rights reserved.