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

3j86kqsm  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(118)

我有一个这样的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"
}

这是一个名为水果的集合。
查询:我试图编写AQL查询来查找SKey,其中Items中的KeyVal值是某个值。
我习惯于使用SQL语法,但这是我第一次冒险使用AQL(Arango DB)。
任何有关语法的帮助都是值得的

vmdwslir

vmdwslir1#

AQL的基础知识在这里解释得很好:https://docs.arangodb.com/3.11/aql/

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

是最小的SQL SELECT ... WHERE语句。
顺便说一句:这里有一个比较介绍:
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是一个数组比较运算符。
请注意,如果您希望使用索引而不对属性路径以及不同的查询进行硬编码,则需要更改数据模型。

相关问题