查询以下 JSON 结构所需的 AQL 语法

Query AQL syntax required for following JSON structure

我有一个这样的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.3/AQL/index.html

FOR item IN Items FILTER item.keyVal == "someValue" RETURN item

将是您的最小 SQL SELECT ... WHERE 语句。

顺便说一句:这里有一个比较介绍:
https://arangodb.com/why-arangodb/sql-aql-comparison/

学习 AQL 的一个好方法是尝试使用小段代码和 return 检查结果,逐渐创建更复杂的查询。

例如,让我们 return 嵌套的 keyVal 值之一:

FOR doc IN Fruits
  RETURN doc.Items.Apple.keyVal
  // "6044e3a3-c064-4171-927c-2440e2f65660"

要通过 Apple keyVal 和 return SKey 进行过滤,您可以这样做:

FOR doc IN Fruits
  FILTER doc.Items.Apple.keyVal == "6044e3a3-c064-4171-927c-2440e2f65660"
  RETURN doc.SKey
  // "123"

您也可以 return 两个 keyVal 值:

FOR doc IN Fruits
  RETURN [
    doc.Items.Apple.keyVal,
    doc.Items.Lemons.keyVal
  ]
  // [
  //   "6044e3a3-c064-4171-927c-2440e2f65660",
  //   "79c45f4d-4f62-4c8e-8de1-79e04fc9b95d"
  // ]

到 return 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}一样。

要return所有keyVal值对属性路径进行硬编码,您可以使用ATTRIBUTES() AQL function:

FOR doc IN Fruits
  FOR attr IN ATTRIBUTES(doc.Items)
    RETURN doc.Items[attr].keyVal

到return SKey如果任何嵌套的keyVal值匹配,我们可以这样做:

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 是数组比较运算符。

请注意,如果您想在不对属性路径进行硬编码的情况下使用索引以及不同的查询,则需要更改您的数据模型。