(来自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