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) }