【问题标题】:Get values from a document recursively递归地从文档中获取值
【发布时间】:2020-09-20 22:23:38
【问题描述】:

我的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 个嵌套子级,这就是我对递归方式感兴趣的原因。

【问题讨论】:

  • 我看不出这与jQueryPostgresql 有什么关系
  • 我认为,如果您将使用这种类型的模式,那么存储和检索文档将很困难。用parentchild 字段存储文档怎么样? this 之类的东西?
  • 这是个好主意,完全值得考虑。不幸的是,我必须处理这样的结构。

标签: database mongodb pymongo


【解决方案1】:

请考虑我的评论:

我认为,如果您将使用这种类型的模式,那么将很难存储和检索文档。用parentchild 字段存储文档怎么样?像这样?

{
    "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"
        }
      }
    }
  }
])

输出:

{
  "_id": ObjectId("5a934e000102030405000000"),
  "child_hash": [
    "5cd9119ae60a0a58d38999468648c371c50b7a",
    "2ac616b42d846fdd52002dc9ad7d810f9f8ce9"
  ],
  "hash": "Q2Nj1nGtGJCkHT6eygg1L0OrprQkhGd846fdd5",
  "parentName": "Parent555"
}

MongoPlayGroundLink

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2017-10-11
    • 2017-03-09
    • 2013-12-10
    相关资源
    最近更新 更多