INSERT¶
Ключевое слово INSERT может быть использовано для вставки новых документов в коллекцию.
Каждая операция INSERT ограничена одной коллекцией, и имя коллекции не должно быть динамическим. В одном AQL-запросе допускается только один оператор INSERT для одной коллекции, и за ним не могут следовать операции чтения или записи, которые обращаются к той же коллекции, операции обхода или AQL-функции, которые могут читать документы.
Синтаксис¶
Синтаксис операции вставки следующий:
INSERT document INTO collection Опционально он может заканчиваться предложением OPTIONS { ... }.
Ключевое слово IN допускается вместо INTO и имеет то же значение.
collection должно содержать имя коллекции, в которую должны быть вставлены документы. document - это документ, который должен быть вставлен, и он может содержать или не содержать атрибут _key. Если атрибут _key не указан, ArangoDB автоматически сгенерирует значение для атрибута _key. При вставке документа также автоматически генерируется номер ревизии документа.
1 2 | |
Операция вставки также может быть выполнена без цикла FOR для вставки одного документа:
1 | |
При вставке в edge collection обязательно указывать атрибуты _from и _to в документе:
1 2 3 4 | |
Параметры запроса¶
Ключевое слово OPTIONS, за которым следует объект с параметрами запроса, может быть опционально предоставлено в операции INSERT.
ignoreErrors¶
ignoreErrors можно использовать для подавления ошибок запроса, которые могут возникнуть при нарушении ограничений уникального ключа:
1 2 3 4 5 6 | |
waitForSync¶
Чтобы убедиться, что данные будут долговечными при возврате запроса вставки, существует опция запроса waitForSync:
1 2 3 4 5 6 | |
overwrite¶
Опция overwrite устарела и заменена overwriteMode.
Если вы хотите заменить существующие документы документами с тем же ключом, существует опция запроса overwrite. Это позволит вам безопасно заменить документы вместо того, чтобы выдать ошибку "unique constraint violated error":
1 2 3 4 5 6 | |
overwriteMode¶
Для дальнейшего контроля поведения INSERT при нарушении уникальных ограничений первичного индекса существует опция overwriteMode. Она предлагает следующие режимы:
"ignore": если документ с указанным значением_keyуже существует, ничего не будет сделано и операция записи не будет выполнена. Операция вставки в этом случае возвращает успех. Этот режим не поддерживает возврат старой версии документа. ИспользованиеRETURN OLDприведет к ошибке разбора, так как не будет возвращена старая версия.RETURN NEWвернет документ только в том случае, если он был вставлен. Если документ уже существовал,RETURN NEWвернетnull."replace": если документ с указанным значением_keyуже существует, он будет перезаписан указанным значением документа. Этот режим также будет использоваться, если режим перезаписи не указан, но флагoverwriteустановлен вtrue.update: если документ с указанным значением_keyуже существует, он будет исправлен (частично обновлен) указанным значением документа."conflict": если документ с указанным значением_keyуже существует, вернуть ошибку нарушения уникального ограничения, чтобы операция вставки завершилась неудачно. Это также поведение по умолчанию в случае, если режим перезаписи не установлен, а флагoverwriteравенfalseили не установлен.
Основное применение вставки документов с режимом перезаписи ignore заключается в том, чтобы убедиться, что определенные документы существуют самым дешевым возможным способом. В случае если целевой документ уже существует, режим ignore является наиболее эффективным, поскольку он не будет извлекать существующий документ из хранилища и не будет записывать в него никаких обновлений.
При использовании режима перезаписи update опции keepNull и mergeObjects управляют тем, как выполняется обновление. См. раздел Операция UPDATE.
1 2 3 4 5 6 | |
exclusive.¶
Движок RocksDB не требует блокировок на уровне коллекции. Различные операции записи в одну и ту же коллекцию не блокируют друг друга, если нет конфликтов запись-запись на одних и тех же документах. С точки зрения разработки приложений может быть желательным иметь исключительный доступ на запись в коллекции, чтобы упростить разработку. Обратите внимание, что записи не блокируют чтения в RocksDB. Исключительный доступ также может ускорить запросы на модификацию, поскольку мы избегаем проверки конфликтов.
Используйте опцию exclusive для достижения этого эффекта на основе каждого запроса:
1 2 3 | |
refillIndexCaches¶
Добавлять ли новые записи в кэш границ в памяти при вставке документов границ.
1 2 | |
Возврат вставленных документов¶
Вставленные документы также могут быть возвращены запросом. В этом случае оператор INSERT может быть оператором RETURN (допускаются также промежуточные операторы LET). Для ссылки на вставленные документы оператор INSERT вводит псевдо-значение NEW.
Документы, содержащиеся в NEW, будут содержать все атрибуты, даже те, которые автоматически генерируются базой данных (например, _id, _key, _rev).
1 | |
Ниже приведен пример с использованием переменной inserted для возврата вставленных документов. Для каждого вставленного документа возвращается ключ документа:
1 2 3 4 5 | |
Транзакционность¶
На одном сервере операция вставки выполняется транзакционно по принципу "все или ничего".
Если используется движок RocksDB и включены промежуточные фиксации, запрос может выполнять промежуточные фиксации транзакций в случае, если запущенная транзакция (AQL-запрос) достигнет заданных пороговых значений размера. В этом случае операции запроса, выполненные до сих пор, будут зафиксированы и не будут откатаны в случае последующего прерывания/отката. Это поведение можно контролировать, изменяя настройки промежуточной фиксации для движка RocksDB.
Для коллекций с шардированием вся операция запроса и/или вставки может не быть транзакционной, особенно если в ней участвуют разные шарды и/или DB-серверы.