ArangoDB AQL обновляет странные имена атрибутов - PullRequest
0 голосов
/ 27 марта 2019

В 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 обновляются значениями из справочной таблицы.

1 Ответ

0 голосов
/ 27 марта 2019

Этот запрос должен помочь вам понять, как можно использовать 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"
  }
]

В нижнем запросе вы заметите, что он на самом деле возвращает данные, он ссылается на LUT, используя doc.plant_code в качестве ключа поиска.

Это гораздо более производительно, чем выполнение там подзапросов, потому что если выу вас было 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, где, если значение не найдено в лютне, он вернетзначение «Неизвестно».

Надеюсь, это поможет вам в вашем конкретном случае использования.

...