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