Delete by Query Operation
-
Use
DeleteByQueryOperation
to delete a large number of documents that match the provided query in a single server call. -
Dynamic behavior:
The deletion of documents matching the specified query is performed in batches of size 1024.
During the deletion process, documents that are added/modified after the delete operation has started
may also be deleted if they match the query criteria. -
Background operation:
This operation is performed in the background on the server. -
In this page:
Delete by dynamic query
Delete all documents in a collection:
# Define the delete by query operation, pass an RQL querying a collection
delete_by_query_op = DeleteByQueryOperation("from 'Orders'")
# Execute the operation by passing it to Operation.send_async
operation = store.operations.send_async(delete_by_query_op)
# All documents in collection 'Orders' will be deleted from the server
from "Orders"
Delete with filtering:
# Define the delete by query operation, pass an RQL querying a collection
delete_by_query_op = DeleteByQueryOperation("from 'Orders' where Freight > 30")
# Execute the operation by passing it to Operation.send_async
operation = store.operations.send_async(delete_by_query_op)
# * All documents matching the specified RQL will be deleted from the server.
#
# * Since the dynamic query was made with a filtering condition,
# an auto-index is generated (if no other matching auto-index already exists).
from "Orders" where Freight > 30
Delete by index query
-
DeleteByQueryOperation
can only be performed on a Map-index.
An exception is thrown when executing the operation on a Map-Reduce index. -
A few overloads are available, see the following examples:
A sample Map-index:
# The index definition:
# =====================
class ProductsByPrice(AbstractIndexCreationTask):
class IndexEntry:
def __init__(self, price: int):
self.price = price
def __init__(self):
super().__init__()
self.map = "from product in products select new {price = product.PricePerUnit}"
Delete documents via an index query:
# Define the delete by query operation, pass an RQL querying the index
delete_by_query_op = DeleteByQueryOperation("from index 'Products/ByPrice' where Price > 10")
# Execute the operation by passing it to Operation.send_async
operation = store.operations.send_async(delete_by_query_op)
# All documents with document-field PricePerUnit > 10 will be deleted from the server.
# Define the delete by query operation
delete_by_query_op = DeleteByQueryOperation(
IndexQuery(query="from index 'Products/ByPrice' where Price > 10")
)
# Execute the operation by passing it to Operation.send_async
operation = store.operations.send_async(delete_by_query_op)
# All documents with document-field PricePerUnit > 10 will be deleted from the server.
from index "Products/ByPrice" where Price > 10
Delete with options:
# Define the delete by query operation
delete_by_query_op = DeleteByQueryOperation(
# QUERY: Specify the query
IndexQuery(query="from index 'Products/ByPrice' where Price > 10"),
# OPTIONS: Specify the options for the operations
# (See all other available options in the Syntax section below)
QueryOperationOptions(
# Allow the operation to operate even if index is stale
allow_stale=True,
# Get info in the operation result about documents that were deleted
retrieve_details=True,
),
)
# Execute the operation by passing it to Operations.send_async
operation = store.operations.send_async(delete_by_query_op)
# * All documents with document-field PricePerUnit > 10 will be deleted from the server
# * Details about deleted documents are available:
details = result.details
document_id_that_was_deleted = details[0]["Id"]
from index "Products/ByPrice" where Price > 10
- Specifying
QueryOperationOptions
is also supported by the other overload methods, see the Syntax section below.