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 <[email protected]>
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 <[email protected]>
---
.../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