使用AQL迭代查询ArangoDB

时间:2015-10-27 15:13:11

标签: key-value arangodb aql

我已经按照以下格式将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

那么,我们如何迭代上述数据?

1 个答案:

答案 0 :(得分: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 }

请注意,当数据结构发生变化时(更多/更少的嵌套级别),上面的工作将不复存在。该查询假定文档具有问题中显示的结构。