From 235fcfeb4087830ff7bd938c6d326359f8c5a3d7 Mon Sep 17 00:00:00 2001 From: Anthony Bryan Gavilan Vinces Date: Wed, 16 Oct 2024 10:35:37 -0500 Subject: [PATCH] Enable Filters in MongoDB Vector Search Retriever (#3333) * added: support to metadata filter using mongodb vector search retriever * fix: format lint --- .../vectorstores/MongoDBAtlas/MongoDBAtlas.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/components/nodes/vectorstores/MongoDBAtlas/MongoDBAtlas.ts b/packages/components/nodes/vectorstores/MongoDBAtlas/MongoDBAtlas.ts index 1554497a..81c6bc2d 100644 --- a/packages/components/nodes/vectorstores/MongoDBAtlas/MongoDBAtlas.ts +++ b/packages/components/nodes/vectorstores/MongoDBAtlas/MongoDBAtlas.ts @@ -86,6 +86,13 @@ class MongoDBAtlas_VectorStores implements INode { additionalParams: true, optional: true }, + { + label: 'Mongodb Metadata Filter', + name: 'mongoMetadataFilter', + type: 'json', + optional: true, + additionalParams: true + }, { label: 'Top K', name: 'topK', @@ -164,9 +171,12 @@ class MongoDBAtlas_VectorStores implements INode { let textKey = nodeData.inputs?.textKey as string let embeddingKey = nodeData.inputs?.embeddingKey as string const embeddings = nodeData.inputs?.embeddings as Embeddings + const mongoMetadataFilter = nodeData.inputs?.mongoMetadataFilter as object let mongoDBConnectUrl = getCredentialParam('mongoDBConnectUrl', credentialData, nodeData) + const filter: MongoDBAtlasVectorSearch['FilterType'] = {} + const mongoClient = await getMongoClient(mongoDBConnectUrl) try { const collection = mongoClient.db(databaseName).collection(collectionName) @@ -181,7 +191,20 @@ class MongoDBAtlas_VectorStores implements INode { embeddingKey }) as unknown as VectorStore - return resolveVectorStoreOrRetriever(nodeData, vectorStore) + if (mongoMetadataFilter) { + const metadataFilter = typeof mongoMetadataFilter === 'object' ? mongoMetadataFilter : JSON.parse(mongoMetadataFilter) + + for (const key in metadataFilter) { + filter.preFilter = { + ...filter.preFilter, + [key]: { + $eq: metadataFilter[key] + } + } + } + } + + return resolveVectorStoreOrRetriever(nodeData, vectorStore, filter) } catch (e) { throw new Error(e) }