#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. Спасибо, Питер , это правильный способ достичь желаемого результата.