This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new decc7c84ecc CAMEL-21559, mongodb: insertOne instead of replaceOne when 
saving without _id (#16604)
decc7c84ecc is described below

commit decc7c84ecc0ff6de782763097e8717484c0147d
Author: thomas-gantenbein-tga 
<32908492+thomas-gantenbein-...@users.noreply.github.com>
AuthorDate: Thu Dec 19 08:56:04 2024 +0100

    CAMEL-21559, mongodb: insertOne instead of replaceOne when saving without 
_id (#16604)
---
 .../camel/component/mongodb/MongoDbProducer.java   | 74 ++++++++++----------
 .../mongodb/integration/MongoDbOperationsIT.java   | 78 +++++++++++-----------
 2 files changed, 77 insertions(+), 75 deletions(-)

diff --git 
a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java
 
b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java
index 8063059cea8..bddbdec15a2 100644
--- 
a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java
+++ 
b/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbProducer.java
@@ -16,15 +16,28 @@
  */
 package org.apache.camel.component.mongodb;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
+import static com.mongodb.client.model.Filters.eq;
+import static org.apache.camel.component.mongodb.MongoDbConstants.BATCH_SIZE;
+import static org.apache.camel.component.mongodb.MongoDbConstants.COLLECTION;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.COLLECTION_INDEX;
+import static org.apache.camel.component.mongodb.MongoDbConstants.CRITERIA;
+import static org.apache.camel.component.mongodb.MongoDbConstants.DATABASE;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.FIELDS_PROJECTION;
+import static org.apache.camel.component.mongodb.MongoDbConstants.LIMIT;
+import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID;
+import static org.apache.camel.component.mongodb.MongoDbConstants.MULTIUPDATE;
+import static org.apache.camel.component.mongodb.MongoDbConstants.NUM_TO_SKIP;
+import static org.apache.camel.component.mongodb.MongoDbConstants.OID;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.OPERATION_HEADER;
+import static org.apache.camel.component.mongodb.MongoDbConstants.OPTIONS;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.RECORDS_AFFECTED;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.RECORDS_MATCHED;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.RESULT_PAGE_SIZE;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.RESULT_TOTAL_SIZE;
+import static 
org.apache.camel.component.mongodb.MongoDbConstants.RETURN_DOCUMENT;
+import static org.apache.camel.component.mongodb.MongoDbConstants.SORT_BY;
+import static org.apache.camel.component.mongodb.MongoDbConstants.UPSERT;
+import static org.apache.camel.component.mongodb.MongoDbConstants.WRITERESULT;
 
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.DistinctIterable;
@@ -41,7 +54,17 @@ import com.mongodb.client.model.ReturnDocument;
 import com.mongodb.client.model.UpdateOptions;
 import com.mongodb.client.model.WriteModel;
 import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.InsertOneResult;
 import com.mongodb.client.result.UpdateResult;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Processor;
@@ -49,34 +72,12 @@ import org.apache.camel.TypeConverter;
 import org.apache.camel.support.DefaultProducer;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.util.ObjectHelper;
+import org.bson.BsonValue;
 import org.bson.Document;
 import org.bson.conversions.Bson;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static com.mongodb.client.model.Filters.eq;
-import static org.apache.camel.component.mongodb.MongoDbConstants.BATCH_SIZE;
-import static org.apache.camel.component.mongodb.MongoDbConstants.COLLECTION;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.COLLECTION_INDEX;
-import static org.apache.camel.component.mongodb.MongoDbConstants.CRITERIA;
-import static org.apache.camel.component.mongodb.MongoDbConstants.DATABASE;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.FIELDS_PROJECTION;
-import static org.apache.camel.component.mongodb.MongoDbConstants.LIMIT;
-import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID;
-import static org.apache.camel.component.mongodb.MongoDbConstants.MULTIUPDATE;
-import static org.apache.camel.component.mongodb.MongoDbConstants.NUM_TO_SKIP;
-import static org.apache.camel.component.mongodb.MongoDbConstants.OID;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.OPERATION_HEADER;
-import static org.apache.camel.component.mongodb.MongoDbConstants.OPTIONS;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.RECORDS_AFFECTED;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.RECORDS_MATCHED;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.RESULT_PAGE_SIZE;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.RESULT_TOTAL_SIZE;
-import static 
org.apache.camel.component.mongodb.MongoDbConstants.RETURN_DOCUMENT;
-import static org.apache.camel.component.mongodb.MongoDbConstants.SORT_BY;
-import static org.apache.camel.component.mongodb.MongoDbConstants.UPSERT;
-import static org.apache.camel.component.mongodb.MongoDbConstants.WRITERESULT;
-
 /**
  * The MongoDb producer.
  */
@@ -635,10 +636,13 @@ public class MongoDbProducer extends DefaultProducer {
                 MongoCollection<Document> dbCol = 
calculateCollection(exchange);
                 Document saveObj = 
exchange.getIn().getMandatoryBody(Document.class);
                 ReplaceOptions options = new ReplaceOptions().upsert(true);
-                UpdateResult result;
+                Object result;
                 if (null == saveObj.get(MONGO_ID)) {
-                    result = dbCol.replaceOne(Filters.where("false"), saveObj, 
options);
-                    exchange.getIn().setHeader(OID, 
result.getUpsertedId().asObjectId().getValue());
+                    result = dbCol.insertOne(saveObj);
+                    BsonValue insertedId = ((InsertOneResult) 
result).getInsertedId();
+                    if (insertedId != null) {
+                        exchange.getIn().setHeader(OID, 
insertedId.asObjectId().getValue());
+                    }
                 } else {
                     Bson mongoIdQuery = eq(MONGO_ID, saveObj.get(MONGO_ID));
                     //You can pass sharded key query via CRITERIA header to 
allow update sharded collection
diff --git 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbOperationsIT.java
 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbOperationsIT.java
index 289dfc61dd9..b2a67b55e7b 100644
--- 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbOperationsIT.java
+++ 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbOperationsIT.java
@@ -16,15 +16,32 @@
  */
 package org.apache.camel.component.mongodb.integration;
 
-import java.util.Arrays;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.List;
+import static com.mongodb.client.model.Accumulators.sum;
+import static com.mongodb.client.model.Aggregates.group;
+import static com.mongodb.client.model.Aggregates.match;
+import static com.mongodb.client.model.Filters.eq;
+import static com.mongodb.client.model.Filters.or;
+import static com.mongodb.client.model.Updates.combine;
+import static com.mongodb.client.model.Updates.currentTimestamp;
+import static com.mongodb.client.model.Updates.set;
+import static org.apache.camel.component.mongodb.MongoDbConstants.CRITERIA;
+import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID;
+import static org.apache.camel.test.junit5.TestSupport.assertListSize;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import com.mongodb.MongoClientSettings;
 import com.mongodb.client.model.Filters;
 import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.InsertOneResult;
 import com.mongodb.client.result.UpdateResult;
+import java.util.Arrays;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.List;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
@@ -40,22 +57,6 @@ import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static com.mongodb.client.model.Accumulators.sum;
-import static com.mongodb.client.model.Aggregates.group;
-import static com.mongodb.client.model.Aggregates.match;
-import static com.mongodb.client.model.Filters.eq;
-import static com.mongodb.client.model.Filters.or;
-import static com.mongodb.client.model.Updates.combine;
-import static com.mongodb.client.model.Updates.currentTimestamp;
-import static com.mongodb.client.model.Updates.set;
-import static org.apache.camel.component.mongodb.MongoDbConstants.CRITERIA;
-import static org.apache.camel.component.mongodb.MongoDbConstants.MONGO_ID;
-import static org.apache.camel.test.junit5.TestSupport.assertListSize;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
 public class MongoDbOperationsIT extends AbstractMongoDbITSupport implements 
ConfigurableRoute {
 
     @BeforeEach
@@ -169,14 +170,16 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport implements Con
         // save (upsert) a document without Id => insert with new Id
         doc = new Document("scientist", "Einstein");
         assertNull(doc.get(MONGO_ID));
-        UpdateResult result = template.requestBody("direct:save", doc, 
UpdateResult.class);
-        assertNotNull(result.getUpsertedId());
-        // Without Id save perform an insert not an update.
-        assertEquals(0, result.getModifiedCount());
+        Object resultObj = template.requestBody("direct:save", doc);
+        // Without Id save performs an insert not an update.
+        assertInstanceOf(InsertOneResult.class, resultObj);
+        InsertOneResult resultInsertOne = (InsertOneResult) resultObj;
+        assertNotNull(resultInsertOne.getInsertedId());
+
         // Testing the save logic
-        Document record1 = testCollection.find(eq(MONGO_ID, 
result.getUpsertedId())).first();
+        Document record1 = testCollection.find(eq(MONGO_ID, 
resultInsertOne.getInsertedId())).first();
         assertEquals("Einstein", record1.get("scientist"),
-                "Scientist field of '" + result.getUpsertedId() + "' must 
equal 'Einstein'");
+                "Scientist field of '" + resultInsertOne.getInsertedId() + "' 
must equal 'Einstein'");
     }
 
     @Test
@@ -196,14 +199,13 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport implements Con
     @Test
     public void testUpdate() {
         for (int i = 1; i <= 100; i++) {
-            String body = null;
-            try (Formatter f = new Formatter();) {
+            String body;
+            try (Formatter f = new Formatter()) {
                 if (i % 2 == 0) {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\"}", i).toString();
                 } else {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\", \"extraField\": true}", i).toString();
                 }
-                f.close();
             }
             template.requestBody("direct:insert", body);
         }
@@ -240,14 +242,13 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport implements Con
         Assumptions.assumeTrue(0 == testCollection.countDocuments(), "The 
collection should have no documents");
 
         for (int i = 1; i <= 100; i++) {
-            String body = null;
-            try (Formatter f = new Formatter();) {
+            String body;
+            try (Formatter f = new Formatter()) {
                 if (i % 2 == 0) {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\"}", i).toString();
                 } else {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\", \"extraField\": true}", i).toString();
                 }
-                f.close();
             }
             template.requestBody("direct:insert", body);
         }
@@ -285,14 +286,13 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport implements Con
     @Test
     public void testUpdateUsingFieldsFilterHeader() {
         for (int i = 1; i <= 100; i++) {
-            String body = null;
-            try (Formatter f = new Formatter();) {
+            String body;
+            try (Formatter f = new Formatter()) {
                 if (i % 2 == 0) {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\"}", i).toString();
                 } else {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\", \"extraField\": true}", i).toString();
                 }
-                f.close();
             }
             template.requestBody("direct:insert", body);
         }
@@ -320,14 +320,13 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport implements Con
     @Test
     public void testRemove() {
         for (int i = 1; i <= 100; i++) {
-            String body = null;
+            String body;
             try (Formatter f = new Formatter()) {
                 if (i % 2 == 0) {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\"}", i).toString();
                 } else {
                     body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\", \"extraField\": true}", i).toString();
                 }
-                f.close();
             }
             template.requestBody("direct:insert", body);
         }
@@ -383,10 +382,9 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport implements Con
     public void testColStats() {
         // Add some records to the collection (and do it via camel-mongodb)
         for (int i = 1; i <= 100; i++) {
-            String body = null;
-            try (Formatter f = new Formatter();) {
+            String body;
+            try (Formatter f = new Formatter()) {
                 body = f.format("{\"_id\":\"testSave%d\", 
\"scientist\":\"Einstein\"}", i).toString();
-                f.close();
             }
             template.requestBody("direct:insert", body);
         }

Reply via email to