Arangodb вставляет несколько строк и использует UPSERT

#arangodb #aql

#arangodb #aql

Вопрос:

как мне вставить несколько строк в arangodb с помощью UPSERT? Коллекция содержит уникальный индекс, который предотвращает вставку дубликатов документов. множественная вставка отлично работает без уникального индекса, но как я могу обработать обновление / замену в множественной вставке уникальным индексом?

вот так:

 INSERT [{doc1},{doc2},{doc3}]
IN collection

UPDATE {} // when duplicate per document
  

Обновление 1

SQL выглядит следующим образом:

 INSERT INTO table(name, value)
VALUES('a', '1'), ('b', 2), ('c', 3)

ON DUPLICATE KEY UPDATE name=`value`
  

Спасибо.

Комментарии:

1. Вы пробовали использовать UPSERT, как описано в документации ArangoDB? Есть ли какая-то конкретная проблема? Можете ли вы добавить более подробную информацию о том, какой запрос вы использовали и какую ошибку вы получаете?

2. Нет проблем, если я использую вставку в одну строку, я пытаюсь использовать UPSERT с вставкой в несколько строк. в качестве примера рассматриваемого кода, если я использую sql, это может выглядеть следующим образом: `ВСТАВИТЬ В таблицу (имя, значение) ЗНАЧЕНИЯ (‘a’, ‘1’), (‘b’, 2), (‘c’, 4) При ДУБЛИРОВАНИИ КЛЮЧА UPDATE name =»значение» `

Ответ №1:

ArangoDB поддерживает операцию UPSERT:https://docs.arangodb.com/3.3/AQL/Operations/Upsert.html

Из документации ArangoDB:

При использовании варианта ОБНОВЛЕНИЯ операции upsert найденный документ будет частично обновлен, что означает, что будут обновлены или добавлены только атрибуты, указанные в UpdateExpression. При использовании варианта ЗАМЕНЫ upsert существующие документы будут заменены контекстами UpdateExpression.

Вы можете использовать UPSERT для обновления / замены / вставки нескольких записей следующим образом:

Давайте сначала вставим несколько примеров документов в ваш collection с уникальным хэш-индексом для name атрибута:

 FOR doc in [
    { "name": "Doc 1", "value": 1 }, 
    { "name": "Doc 2", "value": 1 }, 
    { "name": "Doc 3", "value": 1 }]

INSERT doc IN collection
  

Теперь, если вы хотите выполнить пакетную upsert, вы можете запустить следующий AQL:

 FOR doc in [
    { "name": "Doc 2", "value": 2 }, 
    { "name": "Doc 3", "value": 2 },
    { "name": "Doc 4", "value": 1 }
]

UPSERT { "name": doc.name }

INSERT doc

UPDATE { "value": doc.value } in collection
  

Приведенный выше запрос AQL вставляет один новый Doc 4 документ и обновляет атрибут value для Doc 2 и Doc 3 .

Комментарии:

1. Спасибо за ваш ответ, документ arangodb upsert documnet посвящен вставке одной строки. если я попытаюсь выполнить пакетную вставку, поэтому мне придется повторять upsert для каждой вставки UPSERT{} INSERT{} UPDATE{} , чтобы предотвратить многократный вызов upsert, я должен выполнить пакетную вставку.

2. Пакетная обработка также возможна с помощью UPSERT. Пожалуйста, проверьте мой обновленный ответ выше.

3. Спасибо, Питер , это правильный способ достичь желаемого результата.