ArangoDB AQL обновляет странные имена атрибутов

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


person DWD    schedule 27.03.2019    source источник
comment
Является ли ваша таблица поиска одним документом? Сколько всего у него атрибутов? Вы хотите вернуть желаемый результат или изменить документы в отдельной коллекции?   -  person CodeManX    schedule 27.03.2019


Ответы (1)


Этот запрос должен помочь вам увидеть, как можно использовать LUT (Look Up Table).

Одна интересная особенность 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 раз, чтобы вычислить имя 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, оно вернет значение «Неизвестно».

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

person David Thomas    schedule 27.03.2019
comment
Большое спасибо за это. Моя проблема немного сложнее, так как мне также нужно заменить имя атрибута, например. 49DD3A82-2B49-44F5-A0B2-BD88A32EDB13 необходимо изменить на «Человекочитаемое значение 1» - person DWD; 31.03.2019
comment
Кроме того, в приведенном выше примере указано имя атрибута, то есть «plant_code». Где, как в моем случае, я получаю эти GUID, которые необходимо сопоставить из таблицы. Кроме того, поле сведений изменяется для каждого документа, например. может быть 15 пар ключ: значение в одном документе и 3 в следующем, 7 в следующем и т. д. Любая помощь будет принята с благодарностью! - person DWD; 31.03.2019