【问题标题】:ArangoDB AQL Updating Strange Attribute NamesArangoDB AQL 更新奇怪的属性名称
【发布时间】:2019-03-27 04:20:36
【问题描述】:

在 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 将使用查找表中的值进行更新。

【问题讨论】:

  • 您的查找表是单个文档吗?它总共有多少个属性?是返回想要的结果,还是修改单独集合中的文档?

标签: arangodb aql


【解决方案1】:

此查询应该可以帮助您了解如何使用 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 次支持查询来计算植物代码的名称。

如果您想确认您可以在 LUT 中找到一个值,您可以选择以这种格式进行最终查询:

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

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

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

【讨论】:

  • 非常感谢。我的问题有点复杂,因为我还需要替换属性名称,例如“49DD3A82-2B49-44F5-A0B2-BD88A32EDB13”需要改为“人类可读值1”
  • 另外,在上面的示例中,给出了属性名称,即“plant_code”。在我的情况下,我收到了需要从表中映射的这些 GUID。此外,每个文档的“详细信息”字段都会更改,例如一个文档中可能有 15 个键:值对,下一个文档中有 3 个,下一个文档中有 7 个,等等任何帮助将不胜感激!
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多