2017-09-19 7 views
1
"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に4つのドキュメントAlpha、Alpha1、Alpha2およびAlpha3を持っています。私は単一のクエリの各ドキュメントからキー "MNO"に関連するデータをフェッチしたいと思います。ArangoDB内のネストされたドキュメントから特定のキーをフェッチする

+0

上記の構造のネストは無効です。 適切にネストされた例を提供できますか? – stj

答えて

0

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 
関連する問題