【问题标题】:Mongodb query to get information about circural dependencyMongodb查询以获取有关循环依赖的信息
【发布时间】:2021-10-15 18:32:44
【问题描述】:

我在 MongoDB 中有这样的集合:

[
  {
    "_id": {"$oid": "616309f71b021c754992bfca"},
    "correlatedNodes": [
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["I07WOS4YJ0N7YRFE7309"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "5493000U0YGG4VEQOX65"
  },
  {
    "_id": {"$oid": "616309f71b021c754992bfcb"},
    "correlatedNodes": [
      {
        "type": "IS_DIRECTLY_CONSOLIDATED_BY",
        "nodes": ["529900P6OUCFPVWCFE19", "8945007IZBKFQUQLIP85"]
      },
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["529900P6OUCFPVWCFE19"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "89450012XZ2GPWGIGH37"
  },
  {
    "_id": {"$oid": "616309f71b021c754992bfcc"},
    "correlatedNodes": [
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["815600C9588783AB0210"]
      },
      {
        "type": "IS_DIRECTLY_CONSOLIDATED_BY",
        "nodes": ["815600C9588783AB0210"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "815600228127946DFF05"
  },
  {
    "_id": {"$oid": "616309f71b021c754992bfcd"},
    "correlatedNodes": [
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["549300LI58A0MHGHTZ98"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "549300NV4OCF16TAS048"
  }
]

可以使用查询获取有关循环依赖的信息。 例如 nodeName: 5493000U0YGG4VEQOX65 有列表,其中存在节点名称 89450012XZ2GPWGIGH37 并且该节点也有列表包含 5493000U0YGG4VEQOX65。 我想找到这种情况并列出发生这种情况的节点名称。

【问题讨论】:

  • 你能提供一个你尝试过的查询吗
  • 使用 graphLookup 阶段的聚合应该为您提供该信息。

标签: mongodb dependencies correlation


【解决方案1】:

您可能想使用$graphLookup

  1. $unwindcorrelatedNodescorrelatedNodes.nodes 进行进一步处理
  2. 执行$graphLookup;使用restrictSearchWithMatch 在到达自身节点时停止递归搜索
{
    "$graphLookup": {
        "from": "collection",
        "startWith": "$correlatedNodes.nodes",
        "connectFromField": "correlatedNodes.nodes",
        "connectToField": "nodeName",
        "as": "nodeChain",
        "depthField": "depth",
        "restrictSearchWithMatch": {
            "nodeName": { $ne: "$nodeName" }
        }
    }
}
  1. 使用$reduce判断nodeChain是否为圆形;您可以通过检查nodeChain.correlatedNodes.nodes 是否等于最外层nodeName 来实现此目的
  2. $match 步骤 3 中的结果找到循环案例。

这里是Mongo playground 供您参考。

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-07-11
    • 2020-08-02
    相关资源
    最近更新 更多