使用 AQL 迭代查询 ArangoDB
Iterative querying the ArangoDB using 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
.
那么,我们如何迭代上述数据呢?
如果您真的想在这样的结构中存储数据,没有任何预定义的属性名称,您仍然可以通过将数据动态转换为规范化结构来迭代数据。
以下 AQL 查询为每个文档创建 key/value 对的平面列表:
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 }
请注意,当数据结构发生变化时(more/less 层嵌套),以上内容将不再有效。该查询假定文档具有问题中显示的结构。
我已将 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
.
那么,我们如何迭代上述数据呢?
如果您真的想在这样的结构中存储数据,没有任何预定义的属性名称,您仍然可以通过将数据动态转换为规范化结构来迭代数据。
以下 AQL 查询为每个文档创建 key/value 对的平面列表:
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 }
请注意,当数据结构发生变化时(more/less 层嵌套),以上内容将不再有效。该查询假定文档具有问题中显示的结构。