From 9b0bc1c84de8889212e708ee9815c11aafa5a7e1 Mon Sep 17 00:00:00 2001 From: liugddx Date: Fri, 7 Nov 2025 21:07:01 +0800 Subject: [PATCH 1/3] feat: refactor MongoDBAtlasVectorStore to use org.bson.Document for saving embeddings Signed-off-by: liugddx --- .../vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java index 5c40ceaf208..91fbb9a7c49 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java @@ -261,8 +261,11 @@ public void doAdd(List documents) { List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), this.batchingStrategy); for (Document document : documents) { - MongoDBDocument mdbDocument = new MongoDBDocument(document.getId(), document.getText(), - document.getMetadata(), embeddings.get(documents.indexOf(document))); + org.bson.Document mdbDocument = new org.bson.Document(); + mdbDocument.put(ID_FIELD_NAME, document.getId()); + mdbDocument.put(CONTENT_FIELD_NAME, document.getText()); + mdbDocument.put(METADATA_FIELD_NAME, document.getMetadata()); + mdbDocument.put(this.pathName, EmbeddingUtils.toList(embeddings.get(documents.indexOf(document)))); this.mongoTemplate.save(mdbDocument, this.collectionName); } } From 767f2348a05305523bbb62a66ddd30ec921f233a Mon Sep 17 00:00:00 2001 From: liugddx Date: Thu, 13 Nov 2025 08:03:57 +0800 Subject: [PATCH 2/3] feat: add custom path name support in MongoDBAtlasVectorStore with corresponding integration test Signed-off-by: liugddx --- .../atlas/MongoDBAtlasVectorStore.java | 11 ----- .../atlas/MongoDBAtlasVectorStoreIT.java | 41 +++++++++++++++++++ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java index 91fbb9a7c49..0dec6d21130 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java @@ -467,15 +467,4 @@ public MongoDBAtlasVectorStore build() { } - /** - * The representation of {@link Document} along with its embedding. - * - * @param id The id of the document - * @param content The content of the document - * @param metadata The metadata of the document - * @param embedding The vectors representing the content of the document - */ - public record MongoDBDocument(String id, String content, Map metadata, float[] embedding) { - } - } diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java b/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java index 7d9cd22fec0..4b719b66388 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java @@ -310,6 +310,47 @@ void getNativeClientTest() { }); } + @Test + void customPathNameTest() { + this.contextRunner.run(context -> { + MongoTemplate mongoTemplate = context.getBean(MongoTemplate.class); + EmbeddingModel embeddingModel = context.getBean(EmbeddingModel.class); + + // Create a vector store with custom pathName + String customPathName = "custom_embedding"; + String customCollectionName = "vector_store_custom_path"; + MongoDBAtlasVectorStore vectorStore = MongoDBAtlasVectorStore.builder(mongoTemplate, embeddingModel) + .collectionName(customCollectionName) + .pathName(customPathName) + .initializeSchema(true) + .build(); + + // Clean up collection before test + mongoTemplate.getCollection(customCollectionName).deleteMany(new org.bson.Document()); + + // Add a document + Document document = new Document("Test content for custom pathName", + Collections.singletonMap("meta1", "value1")); + vectorStore.add(List.of(document)); + Thread.sleep(5000); // Wait for indexing + + // Verify the document was saved with the custom pathName + org.bson.Document savedDocument = mongoTemplate.findById(document.getId(), org.bson.Document.class, + customCollectionName); + assertThat(savedDocument).isNotNull(); + assertThat(savedDocument.containsKey(customPathName)).isTrue(); + assertThat(savedDocument.get(customPathName)).isNotNull(); + assertThat(savedDocument.containsKey("embedding")).isFalse(); // Should not have default field name + + // Verify similarity search still works with custom pathName + List results = vectorStore + .similaritySearch(SearchRequest.builder().query("Test content").topK(1).build()); + assertThat(results).hasSize(1); + assertThat(results.get(0).getId()).isEqualTo(document.getId()); + assertThat(results.get(0).getText()).isEqualTo("Test content for custom pathName"); + }); + } + public static String getText(String uri) { var resource = new DefaultResourceLoader().getResource(uri); try { From bbf6da8dd3a999390b990cf3f6f1cbf0a3679662 Mon Sep 17 00:00:00 2001 From: liugddx Date: Thu, 13 Nov 2025 08:04:18 +0800 Subject: [PATCH 3/3] feat: add custom path name support in MongoDBAtlasVectorStore with corresponding integration test Signed-off-by: liugddx --- .../vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java b/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java index 4b719b66388..ca5a196ecea 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/test/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStoreIT.java @@ -340,7 +340,10 @@ void customPathNameTest() { assertThat(savedDocument).isNotNull(); assertThat(savedDocument.containsKey(customPathName)).isTrue(); assertThat(savedDocument.get(customPathName)).isNotNull(); - assertThat(savedDocument.containsKey("embedding")).isFalse(); // Should not have default field name + assertThat(savedDocument.containsKey("embedding")).isFalse(); // Should not + // have + // default + // field name // Verify similarity search still works with custom pathName List results = vectorStore