如何使用 ArangoDB 迭代嵌套 JSON?
How to iterate nested JSON with ArangoDB?
我有 JSON 下一个结构:
[[{"QID":1,"AID":1},{"SubAID":[]}],[{"QID":2,"AID":1},{"SubAID":[2,4]}],[{"QID":3,"AID":1},{"SubAID":[]}],{"MaxArea":"90","MinArea":"16"}]
ArangoDB 可以吗?我试图用 http-api 推送它(我没有适合我的语言的驱动程序 - D),但我得到了 error 500
,也许我错了,也许这个 JSON对 ArangoDB 不正确。
我还想获得任何使用 AQL 迭代此类 JSON 的示例。例如,如果我需要 SubAID
的值,其中 QID
是 2
,我应该如何编写这样的查询?
在主要层面上,ArangoDB 中的文档是 JSON 对象。 JSON 您在上面显示的 JSON 数组中,因此它不会被接受为文档。
你可以做的是将上面的 JSON 包装在一个对象属性中,例如 data
:
{"data":[[{"QID":1,"AID":1},{"SubAID":[]}],[{"QID":2,"AID":1},{"SubAID":[2,4]}],[{"QID":3,"AID":1},{"SubAID":[]}],{"MaxArea":"90","MinArea":"16"}]}
关于查询数据:看起来数据是一个包含数组和对象的数组。在数组内部,数组位置 0 处有一个属性为 QID
和 AID
的对象,数组位置 1 处有一个包含 SubAid
的对象。
如果所有数据都是如此,如下所示的查询应该会找到 QID
值为 2
的文档:
/* iterate over all documents in collection */
FOR doc IN collection
LET s = (
/* iterate over embedded attribute "data */
FOR sub IN doc.data
/* look at QID at array position 0 */
FILTER sub[0].QID == 2
/* first match is sufficient */
LIMIT 1
/* return SubAID value from array position 1 */
RETURN sub[1].SubAID
)
/* only return documents with a match */
FILTER LENGTH(s) > 0
/* return first result from subquery (subquery result is always an array) */
RETURN s[0]
我有 JSON 下一个结构:
[[{"QID":1,"AID":1},{"SubAID":[]}],[{"QID":2,"AID":1},{"SubAID":[2,4]}],[{"QID":3,"AID":1},{"SubAID":[]}],{"MaxArea":"90","MinArea":"16"}]
ArangoDB 可以吗?我试图用 http-api 推送它(我没有适合我的语言的驱动程序 - D),但我得到了 error 500
,也许我错了,也许这个 JSON对 ArangoDB 不正确。
我还想获得任何使用 AQL 迭代此类 JSON 的示例。例如,如果我需要 SubAID
的值,其中 QID
是 2
,我应该如何编写这样的查询?
在主要层面上,ArangoDB 中的文档是 JSON 对象。 JSON 您在上面显示的 JSON 数组中,因此它不会被接受为文档。
你可以做的是将上面的 JSON 包装在一个对象属性中,例如 data
:
{"data":[[{"QID":1,"AID":1},{"SubAID":[]}],[{"QID":2,"AID":1},{"SubAID":[2,4]}],[{"QID":3,"AID":1},{"SubAID":[]}],{"MaxArea":"90","MinArea":"16"}]}
关于查询数据:看起来数据是一个包含数组和对象的数组。在数组内部,数组位置 0 处有一个属性为 QID
和 AID
的对象,数组位置 1 处有一个包含 SubAid
的对象。
如果所有数据都是如此,如下所示的查询应该会找到 QID
值为 2
的文档:
/* iterate over all documents in collection */
FOR doc IN collection
LET s = (
/* iterate over embedded attribute "data */
FOR sub IN doc.data
/* look at QID at array position 0 */
FILTER sub[0].QID == 2
/* first match is sufficient */
LIMIT 1
/* return SubAID value from array position 1 */
RETURN sub[1].SubAID
)
/* only return documents with a match */
FILTER LENGTH(s) > 0
/* return first result from subquery (subquery result is always an array) */
RETURN s[0]