在arangodb中,我有一个查找表,如下所示:
{
'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": "Human readable value 3",
"accuracy": 9.6,
"details": {
"Human readable value 1": "Human readable value 2",
"Human readable value n": true,
}
}
}因此,将使用查找表中的值更新ptype.name和ptype.details。
发布于 2019-03-27 15:13:52
这个查询应该可以帮助您了解如何使用LUT (查找表)。
AQL的一个很酷的特性是,您可以执行查找表查询,并使用LET命令将其值赋给一个变量,然后访问该查找表的内容。
看看这个例子是否有帮助:
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作为查找键来引用查找表。
这比在那里执行子查询的性能要高得多,因为如果您有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中找不到该值,它将返回值'Unknown‘。
希望这篇文章能对你的特殊用例有所帮助。
https://stackoverflow.com/questions/55369764
复制相似问题