Skip to content

Commit bb49750

Browse files
committed
Add a way to delete documents by filter
1 parent 3c98681 commit bb49750

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

lib/meilisearch/index.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,20 @@ def update_documents_in_batches!(documents, batch_size = 1000, primary_key = nil
153153
responses
154154
end
155155

156-
def delete_documents(documents_ids)
157-
if documents_ids.is_a?(Array)
158-
http_post "/indexes/#{@uid}/documents/delete-batch", documents_ids
156+
# Public: Delete documents from an index
157+
#
158+
# documents_ids - An array with document ids (deprecated, optional)
159+
# filter - A hash containing a filter that should match documents.
160+
# Available ONLY with Meilisearch v1.2 and newer (optional)
161+
#
162+
# Returns a Task object.
163+
def delete_documents(documents_ids = nil, filter: nil)
164+
if documents_ids.nil?
165+
http_post "/indexes/#{@uid}/documents/delete", { filter: filter }
159166
else
160-
delete_document(documents_ids)
167+
documents_ids = [documents_ids] unless documents_ids.is_a?(Array)
168+
169+
http_post "/indexes/#{@uid}/documents/delete-batch", documents_ids
161170
end
162171
end
163172
alias delete_multiple_documents delete_documents

spec/meilisearch/index/documents_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,32 @@
390390
expect { index.document(id) }.to raise_document_not_found_meilisearch_api_error
391391
end
392392

393+
it 'deletes documents based on filter from index (with delete route)' do
394+
expect do
395+
index.update_filterable_attributes(['objectId'])
396+
task = index.delete_documents(nil, filter: ['objectId > 0'])
397+
398+
client.wait_for_task(task['taskUid'])
399+
end.to(change { index.documents['results'].size }.by(-documents.size))
400+
end
401+
402+
it 'ignores filter even when documents_ids is empty (with delete-batch route)' do
403+
expect do
404+
task = index.delete_documents([], filter: ['objectId > 0'])
405+
406+
client.wait_for_task(task['taskUid'])
407+
end.to(change { index.documents['results'].size }.by(0))
408+
end
409+
410+
it 'deletes documents based on ids even when receive a filter (with delete-batch route)' do
411+
expect do
412+
index.update_filterable_attributes(['objectId'])
413+
task = index.delete_documents([2], filter: ['objectId > 0'])
414+
415+
client.wait_for_task(task['taskUid'])
416+
end.to(change { index.documents['results'].size }.by(-1))
417+
end
418+
393419
it 'deletes one document synchronously from index (with delete-batch route)' do
394420
id = 2
395421
expect do

0 commit comments

Comments
 (0)