Skip to content

Commit a0aa068

Browse files
committed
Add delete documents by filter for Meilisearch v1.2
1 parent d423537 commit a0aa068

File tree

4 files changed

+79
-8
lines changed

4 files changed

+79
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ client.index('myIndex').deleteDocument(documentId: string | number): Promise<Enq
471471
#### [Delete multiple documents](https://docs.meilisearch.com/reference/api/documents.html#delete-documents)
472472

473473
```ts
474-
client.index('myIndex').deleteDocuments(documentsIds: string[] | number[]): Promise<EnqueuedTask>
474+
client.index('myIndex').deleteDocuments(params: DocumentsDeletionQuery | DocumentsIds): Promise<EnqueuedTask>
475475
```
476476

477477
#### [Delete all documents](https://docs.meilisearch.com/reference/api/documents.html#delete-all-documents)

src/indexes.ts

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ import {
4242
ResourceResults,
4343
RawDocumentAdditionOptions,
4444
ContentType,
45+
DocumentsIds,
46+
DocumentsDeletionQuery,
4547
} from './types'
4648
import { removeUndefinedFromObject } from './utils'
4749
import { HttpRequests } from './http-requests'
@@ -522,19 +524,40 @@ class Index<T extends Record<string, any> = Record<string, any>> {
522524
}
523525

524526
/**
525-
* Delete multiples documents of an index
527+
* Delete multiples documents of an index.
528+
*
529+
* @param params - Params value can be:
530+
*
531+
* - DocumentsDeletionQuery: An object containing the parameters to customize
532+
* your document deletion. Only available in Meilisearch v1.2 and newer
533+
* - DocumentsIds: An array of document ids to delete
526534
*
527-
* @param documentsIds - Array of Document Ids to delete
528535
* @returns Promise containing an EnqueuedTask
529536
*/
530537
async deleteDocuments(
531-
documentsIds: string[] | number[]
538+
params: DocumentsDeletionQuery | DocumentsIds
532539
): Promise<EnqueuedTask> {
533-
const url = `indexes/${this.uid}/documents/delete-batch`
534-
535-
const task = await this.httpRequest.post(url, documentsIds)
540+
// If params is of type DocumentsDeletionQuery
541+
const isDocumentsDeletionQuery =
542+
!Array.isArray(params) && typeof params === 'object'
543+
const endpoint = isDocumentsDeletionQuery
544+
? 'documents/delete'
545+
: 'documents/delete-batch'
546+
const url = `indexes/${this.uid}/${endpoint}`
547+
548+
try {
549+
const task = await this.httpRequest.post(url, params)
550+
return new EnqueuedTask(task)
551+
} catch (e) {
552+
if (
553+
e instanceof MeiliSearchCommunicationError &&
554+
isDocumentsDeletionQuery
555+
) {
556+
e.message = versionErrorHintMessage(e.message, 'deleteDocuments')
557+
}
536558

537-
return new EnqueuedTask(task)
559+
throw e
560+
}
538561
}
539562

540563
/**

src/types/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,12 @@ export type DocumentQuery<T = Record<string, any>> = {
225225
fields?: Fields<T>
226226
}
227227

228+
export type DocumentsDeletionQuery = {
229+
filter: Filter
230+
}
231+
232+
export type DocumentsIds = string[] | number[]
233+
228234
/*
229235
** Settings
230236
*/

tests/documents.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,48 @@ describe('Documents tests', () => {
432432
expect(response.results.length).toEqual(dataset.length)
433433
})
434434

435+
test(`${permission} key: Delete some documents with string filters`, async () => {
436+
const client = await getClient(permission)
437+
await client.index(indexPk.uid).updateFilterableAttributes(['id'])
438+
const { taskUid: addDocTask } = await client
439+
.index(indexPk.uid)
440+
.addDocuments(dataset)
441+
await client.index(indexPk.uid).waitForTask(addDocTask)
442+
443+
const task = await client
444+
.index(indexPk.uid)
445+
.deleteDocuments({ filter: 'id IN [1, 2]' })
446+
447+
const resolvedTask = await client
448+
.index(indexPk.uid)
449+
.waitForTask(task.taskUid)
450+
const documents = await client.index(indexPk.uid).getDocuments<Book>()
451+
452+
expect(resolvedTask.details.deletedDocuments).toEqual(2)
453+
expect(documents.results.length).toEqual(dataset.length - 2)
454+
})
455+
456+
test(`${permission} key: Delete some documents with array filters`, async () => {
457+
const client = await getClient(permission)
458+
await client.index(indexPk.uid).updateFilterableAttributes(['id'])
459+
const { taskUid: addDocTask } = await client
460+
.index(indexPk.uid)
461+
.addDocuments(dataset)
462+
await client.index(indexPk.uid).waitForTask(addDocTask)
463+
464+
const task = await client
465+
.index(indexPk.uid)
466+
.deleteDocuments({ filter: [['id = 1', 'id = 2']] })
467+
468+
const resolvedTask = await client
469+
.index(indexPk.uid)
470+
.waitForTask(task.taskUid)
471+
const documents = await client.index(indexPk.uid).getDocuments<Book>()
472+
473+
expect(resolvedTask.details.deletedDocuments).toEqual(2)
474+
expect(documents.results.length).toEqual(dataset.length - 2)
475+
})
476+
435477
test(`${permission} key: Delete some documents from index that has NO primary key`, async () => {
436478
const client = await getClient(permission)
437479
const { taskUid: addDocTask } = await client

0 commit comments

Comments
 (0)