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
<[email protected]>
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);
}