【问题标题】:Fetch specific key from nested document in ArangoDB从 ArangoDB 中的嵌套文档中获取特定键
【发布时间】:2017-09-19 06:22:00
【问题描述】:
"Alpha":
    {"ABC":
     {"DEF":
         {"2017":
             {"GHI JKL":
                 {"MNO":
                     ["ABCDEFGHIJKLMNOP"]}},
             {"TGY BUG":
                  {"MNO":
                      ["1234567891012456"]}}}}}
"Alpha1":
    {"XYZ":
        {"TUW":
           {"2014":
               {"QRS PQR":
                    {"MNO":
                       ["ZYXWUTSRQPONML"]}}}}}
"Alpha2":
    {"KJM":
       {"LKI":
           {"2005":
              {"MNO":
                 ["POLKIKJUMNHY"]}}}

"Alpha3":
    {"WWW":
       {"CCC DDD":
           {"2011":
               {"MNO":
                    {"POLKIKJUMNHY":"value"}}}}}

我在 ArangoDB 中有四个文档 Alpha、Alpha1、Alpha2 和 Alpha3。我想在单个查询中从每个文档中获取与键“MNO”相关的数据。

【问题讨论】:

  • 上述结构的嵌套无效。你能提供一个正确嵌套的例子吗?

标签: arangodb


【解决方案1】:

(来自https://groups.google.com/forum/#!topic/arangodb/LshKkQMH7lg 的交叉帖子)

如果我理解正确,您想检索任意深度的所有属性值,属性键为“MNO”。

没有以某种方式展平对象的函数,并且在 AQL 中不可能递归。

如果它始终处于同一嵌套级别(如果存在),则可以进行硬编码。

LET doc = {
  "_id": "remove-me",

  "Alpha": {
    "ABC": {
      "DEF": {
        "2017": {
          "GHI JKL": {
            "MNO": ["ABCDEFGHIJKLMNOP"],

            "PQR": true
          },
          "TGY BUG": {
            "MNO": ["1234567891012456"],
            "WXY": 987
          }
        }
      }
    }
  }
}


FOR a1 IN ATTRIBUTES(doc, true)
  FOR a2 IN ATTRIBUTES(doc[a1], true) || []
    FOR a3 IN ATTRIBUTES(doc[a1][a2], true) || []
      FOR a4 IN ATTRIBUTES(doc[a1][a2][a3], true) || []
        FOR a5 IN ATTRIBUTES(doc[a1][a2][a3][a4], true) || []
          FOR a6 IN ATTRIBUTES(doc[a1][a2][a3][a4][a5], true) || []
            FILTER a6 == "MNO"
              RETURN doc[a1][a2][a3][a4][a5]["MNO"]
              // --or-- if you want to return an object {"MNO": value} for each match
              //RETURN KEEP(doc[a1][a2][a3][a4][a5], "MNO")

我尝试了以下类似的方法,但无法让它从不同级别选择“MNO”属性。也许有一个你可以解决的逻辑缺陷。

LET doc = {
  "_id": "remove-me",

  "Alpha": {
    "ABC": {
      "DEF": {
        "2017": {
          "GHI JKL": {
            "MNO": ["ABCDEFGHIJKLMNOP"],

            "PQR": true
          },
          "TGY BUG": {
            "MNO": ["1234567891012456"],
            "WXY": 987
          }
        }
      }
    },
    "DEF2": {
      "MNO": 67
    }
  },
  "Beta": {
    "MNO": "Beta MNO",
    "XXX": false,
    "YYY": null
  }
}


LET v0 = []
FOR a1 IN ATTRIBUTES(doc, true)
  LET v1 = APPEND(v0, a1 == "MNO" ? doc["MNO"] : [])
  FOR a2 IN ATTRIBUTES(doc[a1], true) || []
    LET v2 = APPEND(v1, a2 == "MNO" ? doc[a1]["MNO"] : [])
    FOR a3 IN ATTRIBUTES(doc[a1][a2], true) || []
      LET v3 = APPEND(v2, a3 == "MNO" ? doc[a1][a2]["MNO"] : [])
      FOR a4 IN ATTRIBUTES(doc[a1][a2][a3], true) || []
        LET v4 = APPEND(v3, a4 == "MNO" ? doc[a1][a2][a3]["MNO"] : [])
        FOR a5 IN ATTRIBUTES(doc[a1][a2][a3][a4], true) || []
          LET v5 = APPEND(v4, a5 == "MNO" ? doc[a1][a2][a3][a4]["MNO"] : [])
          FOR a6 IN ATTRIBUTES(doc[a1][a2][a3][a4][a5], true) || []
            LET v6 = APPEND(v5, a6 == "MNO" ? doc[a1][a2][a3][a4][a5]["MNO"] : [])
            RETURN v6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2018-11-30
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多