2

JSON データを次の形式で ArangoDB コレクションに保存しました。

{ 
  "data": {
    "1":   [ {"db_name": "DSP"}, {"rel": "2"} ], 
    "2":   [ {"rel_name": "DataSource"}, {"tuple": "201"}, {"tuple": "202"}, {"tuple": "203"} ],
    "201": [ {"src_id": "Pos201510070"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151007"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "postgres"}, {"port": "None"} ],
    "202": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"},{"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"}, {"src_type": "Structured"}, {"db_name": "DSP"}, {"port": "5432"} ],
    "203": [ {"src_id": "pos201510060"}, {"src_name": "Postgres"}, {"password": "root"}, {"host": "localhost"}, {"created_date": "20151006"}, {"user_name": "postgres"},{"src_type": "Structured"},{"db_name": "maindb"},{"port": "5432"} ]
  }
}

私はArangoDBが初めてです。ArangoDB からのデータの保存とクエリについてはわかりません。私のデータには事前定義されたキーはなく、データは時間とともに入力されます。私のデータは、固定数の属性を持たない半構造化データのようなもので、反復リスト構造のために少し複雑です。

まず、上記の形式を ArangoDB に格納するための最良の方法を誰でも提案できます。

次に、このデータを次の方法でクエリしたい: 任意のキーを指定する (実行時に指定することにより、事前に知られていない)、またはキーと値のペアの組み合わせを指定する (例: 、Key1 == value1または AND または OR 論理を使用した組み合わせ)のような演算子Key1 == value1 AND Key2 == value2 OR Key3== value3

では、上記のデータをどのように反復処理できるのでしょうか?

4

1 に答える 1

1

定義済みの属性名なしで、このような構造にデータを保存したい場合でも、その場で正規化された構造に変換することで、データを反復処理できます。

次の AQL クエリは、各ドキュメントのキーと値のペアのフラット リストを作成します。

FOR doc IN collection 
  LET attributes = ATTRIBUTES(doc.data) 
  FOR attribute IN attributes 
    FOR arrayItem IN doc.data[attribute] 
      LET key = ATTRIBUTES(arrayItem)[0] 
      LET value = arrayItem[key] 
      RETURN { _key: doc._key key: key, value: value }

このクエリの結果は次のようになります。

[ 
  { 
    "_key" : "864582648369", 
    "key" : "password", 
    "value" : "root" 
  }, 
  { 
    "_key" : "864582648369", 
    "key" : "db_name", 
    "value" : "postgres" 
  }, 
  { 
    "_key" : "864582648369", 
    "key" : "port", 
    "value" : "None" 
  }, 
  ...
]

選択したフィルター条件を追加することで、フィルターを簡単に適用できるようになりました。

FOR doc IN collection 
  LET attributes = ATTRIBUTES(doc.data) 
  FOR attribute IN attributes 
    FOR arrayItem IN doc.data[attribute] 
      LET key = ATTRIBUTES(arrayItem)[0] 
      LET value = arrayItem[key] 
      FILTER key == 'password' || key == 'port' || (key == 'db_name' && value == 'postgres') 
      RETURN { _key: doc._key, key: key, value: value }

データ構造が変更されると (ネストのレベルが増える/減る)、上記は機能しなくなることに注意してください。クエリは、質問に示されている構造を持つドキュメントを想定しています。

于 2015-10-27T15:51:29.410 に答える