REMOVE¶
Ключевое слово REMOVE
может быть использовано для удаления документов из коллекции.
Каждая операция REMOVE
ограничена одной коллекцией, и имя коллекции не должно быть динамическим. В одном запросе AQL допускается только один оператор REMOVE
для одной коллекции, и за ним не могут следовать операции чтения или записи, которые обращаются к той же коллекции, операции обхода или функции AQL, которые могут читать документы.
Синтаксис¶
Синтаксис операции удаления следующий:
REMOVE keyExpression IN collection
Опционально он может заканчиваться предложением OPTIONS { ... }
.
collection
должно содержать имя коллекции, из которой нужно удалить документы. keyExpression
должно быть выражением, содержащим идентификатор документа. Это может быть либо строка (которая затем должна содержать ключ документа), либо документ, который должен содержать атрибут _key
.
Таким образом, следующие запросы эквивалентны:
1 2 |
|
1 2 |
|
1 2 |
|
Операция remove может удалять произвольные документы, и эти документы не обязательно должны быть идентичны тем, которые были получены предшествующим оператором FOR
:
1 2 |
|
1 2 3 |
|
Можно удалить и отдельный документ, используя строку ключа документа или документ с атрибутом _key
:
1 |
|
1 2 |
|
Применяется ограничение на одну операцию удаления в запросе и коллекции. Следующий запрос вызывает ошибку доступ после модификации данных из-за третьей операции удаления:
1 2 3 |
|
Параметры запроса¶
ignoreErrors
¶
ignoreErrors
можно использовать для подавления ошибок запроса, которые могут возникнуть при попытке удалить несуществующие документы. Например, следующий запрос будет неудачным, если один из удаляемых документов не существует:
1 2 |
|
Указав опцию запроса ignoreErrors
, эти ошибки можно подавить, чтобы запрос завершился:
1 2 |
|
waitForSync
¶
Чтобы убедиться, что данные были записаны на диск при возврате запроса, существует опция запроса waitForSync
:
1 2 |
|
ignoreRevs
¶
Чтобы случайно не удалить документы, которые были обновлены с момента последнего извлечения, вы можете использовать опцию ignoreRevs
, чтобы либо позволить ArangoDB сравнивать значения _rev
и добиваться успеха, только если они совпадают, либо позволить ArangoDB игнорировать их (по умолчанию):
1 2 |
|
exclusive
¶
Движок RocksDB не требует блокировок на уровне коллекции. Различные операции записи в одну и ту же коллекцию не блокируют друг друга, если нет конфликтов запись-запись на одних и тех же документах. С точки зрения разработки приложений может быть желательным иметь исключительный доступ на запись в коллекции, чтобы упростить разработку. Обратите внимание, что записи не блокируют чтения в RocksDB. Исключительный доступ также может ускорить запросы на модификацию, поскольку мы избегаем проверки конфликтов.
Используйте опцию exclusive
для достижения этого эффекта на основе каждого запроса:
1 2 3 4 |
|
refillIndexCaches
¶
Удалять ли существующие записи из кэша граней в памяти и пополнять его другими гранями, если документы граней удаляются.
1 2 |
|
Возвращение удаленных документов¶
Удаленные документы также могут быть возвращены запросом. В этом случае за оператором REMOVE
должен следовать оператор RETURN
(допускаются также промежуточные операторы LET
).REMOVE
вводит псевдо-значение OLD
для ссылки на удаленные документы:
1 |
|
Ниже приведен пример использования переменной с именем removed
для регистрации удаленных документов. Для каждого удаленного документа будет возвращен ключ документа.
1 2 3 4 |
|
Транзакционность¶
На одном сервере удаление документов выполняется транзакционно по принципу "все или ничего".
Если используется движок RocksDB и включены промежуточные фиксации, запрос может выполнять промежуточные фиксации транзакций в случае, если запущенная транзакция (AQL-запрос) достигнет заданных пороговых значений размера. В этом случае операции запроса, выполненные до сих пор, будут зафиксированы и не будут откатаны в случае последующего отмены/отката. Это поведение можно контролировать, изменяя настройки промежуточной фиксации для движка RocksDB.
Для коллекций с шардированием вся операция запроса и/или удаления может не быть транзакционной, особенно если она затрагивает разные шарды и/или DB-серверы.