Перейти к содержанию

REMOVE

Ключевое слово REMOVE может быть использовано для удаления документов из коллекции.

Каждая операция REMOVE ограничена одной коллекцией, и имя коллекции не должно быть динамическим. В одном запросе AQL допускается только один оператор REMOVE для одной коллекции, и за ним не могут следовать операции чтения или записи, которые обращаются к той же коллекции, операции обхода или функции AQL, которые могут читать документы.

Синтаксис

Синтаксис операции удаления следующий:

REMOVE keyExpression IN collection

Опционально он может заканчиваться предложением OPTIONS { ... }.

collection должно содержать имя коллекции, из которой нужно удалить документы. keyExpression должно быть выражением, содержащим идентификатор документа. Это может быть либо строка (которая затем должна содержать ключ документа), либо документ, который должен содержать атрибут _key.

Таким образом, следующие запросы эквивалентны:

1
2
FOR u IN users
  REMOVE { _key: u._key } IN users
1
2
FOR u IN users
  REMOVE u._key IN users
1
2
FOR u IN users
  REMOVE u IN users

Операция remove может удалять произвольные документы, и эти документы не обязательно должны быть идентичны тем, которые были получены предшествующим оператором FOR:

1
2
FOR i IN 1..1000
  REMOVE { _key: CONCAT('test', i) } IN users
1
2
3
FOR u IN users
  FILTER u.active == false
  REMOVE { _key: u._key } IN backup

Можно удалить и отдельный документ, используя строку ключа документа или документ с атрибутом _key:

1
REMOVE 'john' IN users
1
2
LET doc = DOCUMENT('users/john')
REMOVE doc IN users

Применяется ограничение на одну операцию удаления в запросе и коллекции. Следующий запрос вызывает ошибку доступ после модификации данных из-за третьей операции удаления:

1
2
3
REMOVE 'john' IN users
REMOVE 'john' IN backups // OK, different collection
REMOVE 'mary' IN users   // Error, users collection again

Параметры запроса

ignoreErrors

ignoreErrors можно использовать для подавления ошибок запроса, которые могут возникнуть при попытке удалить несуществующие документы. Например, следующий запрос будет неудачным, если один из удаляемых документов не существует:

1
2
FOR i IN 1..1000
  REMOVE { _key: CONCAT('test', i) } IN users

Указав опцию запроса ignoreErrors, эти ошибки можно подавить, чтобы запрос завершился:

1
2
FOR i IN 1..1000
  REMOVE { _key: CONCAT('test', i) } IN users OPTIONS { ignoreErrors: true }

waitForSync

Чтобы убедиться, что данные были записаны на диск при возврате запроса, существует опция запроса waitForSync:

1
2
FOR i IN 1..1000
  REMOVE { _key: CONCAT('test', i) } IN users OPTIONS { waitForSync: true }

ignoreRevs

Чтобы случайно не удалить документы, которые были обновлены с момента последнего извлечения, вы можете использовать опцию ignoreRevs, чтобы либо позволить ArangoDB сравнивать значения _rev и добиваться успеха, только если они совпадают, либо позволить ArangoDB игнорировать их (по умолчанию):

1
2
FOR i IN 1..1000
  REMOVE { _key: CONCAT('test', i), _rev: "1287623" } IN users OPTIONS { ignoreRevs: false }

exclusive

Движок RocksDB не требует блокировок на уровне коллекции. Различные операции записи в одну и ту же коллекцию не блокируют друг друга, если нет конфликтов запись-запись на одних и тех же документах. С точки зрения разработки приложений может быть желательным иметь исключительный доступ на запись в коллекции, чтобы упростить разработку. Обратите внимание, что записи не блокируют чтения в RocksDB. Исключительный доступ также может ускорить запросы на модификацию, поскольку мы избегаем проверки конфликтов.

Используйте опцию exclusive для достижения этого эффекта на основе каждого запроса:

1
2
3
4
FOR doc IN collection
  REPLACE doc._key
  WITH { replaced: true }
  OPTIONS { exclusive: true }

refillIndexCaches

Удалять ли существующие записи из кэша граней в памяти и пополнять его другими гранями, если документы граней удаляются.

1
2
REMOVE { _key: "123" } IN edgeColl
  OPTIONS { refillIndexCaches: true }

Возвращение удаленных документов

Удаленные документы также могут быть возвращены запросом. В этом случае за оператором REMOVE должен следовать оператор RETURN (допускаются также промежуточные операторы LET).REMOVE вводит псевдо-значение OLD для ссылки на удаленные документы:

1
REMOVE keyExpression IN collection options RETURN OLD

Ниже приведен пример использования переменной с именем removed для регистрации удаленных документов. Для каждого удаленного документа будет возвращен ключ документа.

1
2
3
4
FOR u IN users
  REMOVE u IN users
  LET removed = OLD
  RETURN removed._key

Транзакционность

На одном сервере удаление документов выполняется транзакционно по принципу "все или ничего".

Если используется движок RocksDB и включены промежуточные фиксации, запрос может выполнять промежуточные фиксации транзакций в случае, если запущенная транзакция (AQL-запрос) достигнет заданных пороговых значений размера. В этом случае операции запроса, выполненные до сих пор, будут зафиксированы и не будут откатаны в случае последующего отмены/отката. Это поведение можно контролировать, изменяя настройки промежуточной фиксации для движка RocksDB.

Для коллекций с шардированием вся операция запроса и/или удаления может не быть транзакционной, особенно если она затрагивает разные шарды и/или DB-серверы.

Комментарии