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 8acc8d73838 Ability to pass sharded key to upsert query in mongo 
component (#7666)
8acc8d73838 is described below

commit 8acc8d738386959b0dd8888efba49752aa80897d
Author: Kanstantsin I <vault.sch...@gmail.com>
AuthorDate: Tue May 24 10:51:21 2022 +0300

    Ability to pass sharded key to upsert query in mongo component (#7666)
    
    Co-authored-by: Kanstantsin Ihnatsenka <kignate...@tula.co>
---
 .../camel/component/mongodb/MongoDbProducer.java   |  6 ++++-
 .../mongodb/integration/MongoDbOperationsIT.java   | 27 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)

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 f95805d81e5..e491d086dac 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
@@ -631,7 +631,11 @@ public class MongoDbProducer extends DefaultProducer {
                     result = dbCol.replaceOne(Filters.where("false"), saveObj, 
options);
                     exchange.getIn().setHeader(OID, 
result.getUpsertedId().asObjectId().getValue());
                 } else {
-                    result = dbCol.replaceOne(eq(MONGO_ID, 
saveObj.get(MONGO_ID)), saveObj, options);
+                    Bson mongoIdQuery = eq(MONGO_ID, saveObj.get(MONGO_ID));
+                    //You can pass sharded key query via CRITERIA header to 
allow update sharded collection
+                    Bson query = exchange.getIn().getHeader(CRITERIA, 
Bson.class);
+                    query = query != null ? Filters.and(query, mongoIdQuery) : 
mongoIdQuery;
+                    result = dbCol.replaceOne(query, saveObj, options);
                     exchange.getIn().setHeader(OID, saveObj.get(MONGO_ID));
                 }
                 return result;
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 d5d77825cd2..5c0583bc853 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
@@ -43,6 +43,7 @@ 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;
@@ -128,6 +129,32 @@ public class MongoDbOperationsIT extends 
AbstractMongoDbITSupport {
 
     }
 
+    @Test
+    public void testSaveWithShardedKey() {
+        // Prepare test
+        assertEquals(0, testCollection.countDocuments());
+        Object[] req = new Object[] {
+                new Document(MONGO_ID, "testSave1").append("scientist", 
"Einstein").append("country", "Germany").toJson(),
+                new Document(MONGO_ID, "testSave2").append("scientist", 
"Copernicus").append("country", "Poland").toJson() };
+        Object result = template.requestBody("direct:insert", req);
+        assertTrue(result instanceof List);
+        assertEquals(2, testCollection.countDocuments(), "Number of records 
persisted must be 2");
+
+        // Testing the save logic
+        Document record1 = testCollection.find(eq(MONGO_ID, 
"testSave1")).first();
+        assertEquals("Einstein", record1.get("scientist"), "Scientist field of 
'testSave1' must equal 'Einstein'");
+        record1.put("scientist", "Kepler");
+
+        //Pass sharded collection key as CRITERIA to prevent 
"MongoWriteException: Failed to target upsert by query :: could not extract 
exact shard key"
+        result = template.requestBodyAndHeader("direct:save", record1, 
CRITERIA, eq("country","Germany"));
+        assertTrue(result instanceof UpdateResult);
+
+        record1 = testCollection.find(eq(MONGO_ID, "testSave1")).first();
+        assertEquals("Kepler", record1.get("scientist"),
+                "Scientist field of 'testSave1' must equal 'Kepler' after save 
operation");
+
+    }
+
     @Test
     public void testSaveWithoutId() {
         // Prepare test

Reply via email to