【问题标题】:Query AQL syntax required for following JSON structure查询以下 JSON 结构所需的 AQL 语法
【发布时间】:2018-06-19 01:53:42
【问题描述】:

我有一个这样的 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 查询来查找 Items 中的 KeyVal 值是某个值的 SKey。

我习惯于使用 SQL 语法,但这是我第一次涉足 AQL(Arango DB)。

感谢任何有关语法的帮助

【问题讨论】:

    标签: database collections nosql arangodb aql


    【解决方案1】:

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

    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 function

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

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

    【讨论】:

    • @CoDmanX 非常感谢。这个解释非常彻底,非常有帮助。我对 AQL 有一个很好的概述,并且发布的链接也很有帮助。非常感谢
    • 他只是在这里剪切 + 粘贴了文档 :))))
    • 仍然非常详尽,您对帮助我理解的查询添加了个人风格
    • @KavehVahedipour 也爱你?
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多