Skip to content

Commit c6f42e8

Browse files
committed
Add delete documents by filter for Meilisearch v1.2
1 parent 37c550b commit c6f42e8

File tree

4 files changed

+97
-8
lines changed

4 files changed

+97
-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: 31 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'
@@ -523,19 +525,41 @@ class Index<T extends Record<string, any> = Record<string, any>> {
523525
}
524526

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

538-
return new EnqueuedTask(task)
561+
throw e
562+
}
539563
}
540564

541565
/**

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: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,48 @@ describe('Documents tests', () => {
451451
expect(response.results.length).toEqual(dataset.length)
452452
})
453453

454+
test(`${permission} key: Delete some documents with string filters`, async () => {
455+
const client = await getClient(permission)
456+
await client.index(indexPk.uid).updateFilterableAttributes(['id'])
457+
const { taskUid: addDocTask } = await client
458+
.index(indexPk.uid)
459+
.addDocuments(dataset)
460+
await client.index(indexPk.uid).waitForTask(addDocTask)
461+
462+
const task = await client
463+
.index(indexPk.uid)
464+
.deleteDocuments({ filter: 'id IN [1, 2]' })
465+
466+
const resolvedTask = await client
467+
.index(indexPk.uid)
468+
.waitForTask(task.taskUid)
469+
const documents = await client.index(indexPk.uid).getDocuments<Book>()
470+
471+
expect(resolvedTask.details.deletedDocuments).toEqual(2)
472+
expect(documents.results.length).toEqual(dataset.length - 2)
473+
})
474+
475+
test(`${permission} key: Delete some documents with array filters`, async () => {
476+
const client = await getClient(permission)
477+
await client.index(indexPk.uid).updateFilterableAttributes(['id'])
478+
const { taskUid: addDocTask } = await client
479+
.index(indexPk.uid)
480+
.addDocuments(dataset)
481+
await client.index(indexPk.uid).waitForTask(addDocTask)
482+
483+
const task = await client
484+
.index(indexPk.uid)
485+
.deleteDocuments({ filter: [['id = 1', 'id = 2']] })
486+
487+
const resolvedTask = await client
488+
.index(indexPk.uid)
489+
.waitForTask(task.taskUid)
490+
const documents = await client.index(indexPk.uid).getDocuments<Book>()
491+
492+
expect(resolvedTask.details.deletedDocuments).toEqual(2)
493+
expect(documents.results.length).toEqual(dataset.length - 2)
494+
})
495+
454496
test(`${permission} key: Delete some documents from index that has NO primary key`, async () => {
455497
const client = await getClient(permission)
456498
const { taskUid: addDocTask } = await client
@@ -492,6 +534,23 @@ describe('Documents tests', () => {
492534
expect(returnedIds).not.toContain(ids[1])
493535
})
494536

537+
test(`${permission} key: Delete some documents should trigger error with a hint on unknown route`, async () => {
538+
const apiKey = await getKey(permission)
539+
const client = new MeiliSearch({ host: `${HOST}/indexes`, apiKey })
540+
541+
try {
542+
await client.index(indexPk.uid).deleteDocuments({ filter: 'id = 1' })
543+
544+
fail(
545+
'deleteDocuments should have raised an error when the route does not exist'
546+
)
547+
} catch (e: any) {
548+
expect(e.message).toEqual(
549+
"Not Found\nHint: It might not be working because maybe you're not up to date with the Meilisearch version that deleteDocuments call requires."
550+
)
551+
}
552+
})
553+
495554
test(`${permission} key: Delete all document from index that has NO primary key`, async () => {
496555
const client = await getClient(permission)
497556
const task = await client.index(indexNoPk.uid).deleteAllDocuments()

0 commit comments

Comments
 (0)