我有一个像这样的 JSON 结构
{
"Items": {
"Apple": {
"Type": 2,
"keyVal": "6044e3a3-c064-4171-927c-2440e2f65660"
},
"Lemons": {
"Type": 1,
"keyVal": "79c45f4d-4f62-4c8e-8de1-79e04fc9b95d"
}
},
"Species": 0,
"Name": "Test Fruit",
"Description": "Test Des",
"Creator": "xyz",
"SKey" : "123"
}
这存在于名为“Fruits”的集合中。
查询: 我正在尝试编写 AQL 查询来查找 SKey,其中 Items 中的 KeyVal 值是某个值。
我传统上习惯了 SQL 语法,但这是我第一次尝试 AQL(Arango DB)。
感谢任何有关语法的帮助
AQL 的基础知识在这里得到了很好的解释:https://docs.arangodb.com/3.11/aql/
FOR item IN Items FILTER item.keyVal == "someValue" RETURN item
将是您的最小 SQL
SELECT ... WHERE
语句。
BTW:这里有一个对比介绍:
https://arangodb.com/why-arangodb/sql-aql-comparison/
学习 AQL 的一个好方法是尝试小段代码并返回结果进行检查,以逐步创建更复杂的查询。
例如,让我们返回嵌套的 keyVal 值之一:
FOR doc IN Fruits
RETURN doc.Items.Apple.keyVal
// "6044e3a3-c064-4171-927c-2440e2f65660"
要按 Apple keyVal 过滤并返回 SKey,您可以执行以下操作:
FOR doc IN Fruits
FILTER doc.Items.Apple.keyVal == "6044e3a3-c064-4171-927c-2440e2f65660"
RETURN doc.SKey
// "123"
您也可以返回两个 keyVal 值:
FOR doc IN Fruits
RETURN [
doc.Items.Apple.keyVal,
doc.Items.Lemons.keyVal
]
// [
// "6044e3a3-c064-4171-927c-2440e2f65660",
// "79c45f4d-4f62-4c8e-8de1-79e04fc9b95d"
// ]
要在其中一个等于某个值时返回 SKey,请尝试以下操作:
FOR doc IN Fruits
FILTER "79c45f4d-4f62-4c8e-8de1-79e04fc9b95d" IN [
doc.Items.Apple.keyVal,
doc.Items.Lemons.keyVal
]
RETURN doc.SKey
注意:
IN
在这里用作数组运算符,就像{array}中包含的{value}一样。
要返回对属性路径进行硬编码的所有 keyVal 值,您可以使用 ATTRIBUTES() AQL 函数:
FOR doc IN Fruits
FOR attr IN ATTRIBUTES(doc.Items)
RETURN doc.Items[attr].keyVal
要在任何嵌套的 keyVal 值匹配时返回 SKey,我们可以这样做:
FOR doc IN Fruits
LET keyVals = (FOR attr IN ATTRIBUTES(doc.Items)
RETURN doc.Items[attr].keyVal
)
FILTER "6044e3a3-c064-4171-927c-2440e2f65660" IN keyVals
RETURN doc.SKey
注意:这使用子查询来捕获中间结果。
要测试是否包含所有指定值,您可以这样做:
LET ids = [
"79c45f4d-4f62-4c8e-8de1-79e04fc9b95d",
"6044e3a3-c064-4171-927c-2440e2f65660"
]
FOR doc IN Fruits
LET keyVals = (FOR attr IN ATTRIBUTES(doc.Items)
RETURN doc.Items[attr].keyVal
)
FILTER ids ALL IN keyVals
RETURN doc.SKey
ALL IN 是数组比较运算符。
请注意,如果您想使用索引而不硬编码属性路径以及不同的查询,则需要更改数据模型。