ArangoDB AQL更新奇怪的属性名称

时间:2019-03-27 04:20:36

标签: arangodb aql

在arangodb中,我有如下查找表:

SELECT first_name
from actor
where first_name like 'b%' or first_name like 's%' or first_name like 'p%';

我在这样一个单独的集合中有一些文档,这些文档具有不可读的属性和值对,如以下“详细信息”所述:

{
   '49DD3A82-2B49-44F5-A0B2-BD88A32EDB13' = 'Human readable value 1',
   'B015E210-27BE-4AA7-83EE-9F754F8E469A' = 'Human readable value 2',
   'BC54CF8A-BB18-4E2C-B333-EA7086764819' = 'Human readable value 3',
   '8DE15947-E49B-4FDC-89EE-235A330B7FEB' = 'Human readable value n'
}

我需要通过从查找表中查找人类可读的值来更新上述文档,并且还需要使用也在查找表中找到的可读属性名称来更新非人类可读的属性。

结果应如下所示:

{
    "ptype": {
      "name": "BC54CF8A-BB18-4E2C-B333-EA7086764819",
      "accuracy": 9.6,
      "details": {
        "49DD3A82-2B49-44F5-A0B2-BD88A32EDB13": "B015E210-27BE-4AA7-83EE-9F754F8E469A",
        "8DE15947-E49B-4FDC-89EE-235A330B7FEB": true,
      }
    }
}

因此ptype.name和ptype.details会使用查找表中的值进行更新。

1 个答案:

答案 0 :(得分:0)

此查询应帮助您了解如何使用LUT(查找表)。

AQL的一个很酷的功能是您可以执行LUT查询,并使用LET命令将其值分配给变量,然后稍后访问该LUT的内容。

查看此示例是否有帮助:

LET lut = {
    'aaa' : 'Apples',
    'bbb' : 'Bananas',
    'ccc' : 'Carrots'
}

LET garden = [
    {
        'size': 'Large',
        'plant_code': 'aaa'
    },
    {
        'size': 'Medium',
        'plant_code': 'bbb'
    },
    {
        'size': 'Small',
        'plant_code': 'ccc'
    }
]

FOR doc IN garden
RETURN {
    'size': doc.size,
    'vegetable': lut[doc.plant_code]
}

此查询的结果是:

[
  {
    "size": "Large",
    "vegetable": "Apples"
  },
  {
    "size": "Medium",
    "vegetable": "Bananas"
  },
  {
    "size": "Small",
    "vegetable": "Carrots"
  }
]

您会发现在底部查询中实际上返回了数据,它是通过使用doc.plant_code作为查找键来引用LUT。

与在此处执行子查询相比,它的性能要高得多,因为如果您有100,000个花园文档,则您不想执行100,000次支持性查询来找出plant_code的名称。

如果您想确认可以在LUT中找到一个值,则可以选择使用以下格式的最终​​查询:

FOR doc IN garden
RETURN {
    'size': doc.size,
    'vegetable': (lut[doc.plant_code] ? lut[doc.plant_code] : 'Unknown')
}

这种返回vegetable的值的可选方法是使用内联if / then / else,如果在lut中找不到该值,它将返回值“未知”。

希望这对您的特定用例有帮助。