38.7.2.3. update
更新集合上的一个或多个记录。需要过滤器查询和更新规则。
您可以使用 MongoDBConstants.CRITERIA 标头定义为 Bson
,并在 Body 中将更新规则定义为 Bson
。
在增强 后,使用 MongoDBConstants.CRITERIA 标头作为 Bson
来查询 mongodb,在进行更新前,您应该注意到,在聚合策略中使用了 mongodb 更新时,您需要在聚合策略过程中从生成的 camel Exchange 中删除它,然后应用 mongodb 更新。
如果您在聚合和/或重新定义 MongoDBConstants.CRITERIA 标头期间没有删除此标头,然后再向 mongodb producer 端点发送 camel Exchange payload,在更新 mongodb 时可能会最终使用无效的 camel Exchange payload。
第二种方法 Require a List<Bson> 作为 IN 消息正文,其中包含正好 2 个元素:
- 元素 1 (index 0) TOKEN 过滤器查询 TOKEN 确定将影响哪些对象,与典型的查询对象相同
- 元素 2 (index 1) TOKEN update rules TOKEN 如何更新匹配的对象。支持 MongoDB 中的所有 修饰符操作。
Multiupdates
默认情况下,MongoDB 只会更新 1 个对象,即使多个对象与过滤器查询匹配。要指示 MongoDB 更新所有 匹配的记录,请将 CamelMongoDbMultiUpdate
IN 消息标头设置为 true
。
带有密钥 CamelMongoDbRecordsAffected
的标头将被返回(MongoDbConstants.RECORDS_AFFECTED
常度)已更新的记录数(从 WriteResult.getN ()
中复制)。
支持以下 IN 消息标头:
标头键 | 快速持续 | 描述(从 MongoDB API 文档中提取) | 预期类型 |
---|---|---|---|
|
| 如果更新应当应用到与所有对象匹配的所有对象。请参阅 http://www.mongodb.org/display/DOCS/Atomic+Operations | boolean/Boolean |
|
| 如果数据库应该创建元素(如果不存在) | boolean/Boolean |
例如,以下命令将通过将 "scientist" 字段的值设置为 "Darwin" 字段来更新 all records,其 filterField 字段等于 true :
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update"); List<Bson> body = new ArrayList<>(); Bson filterField = Filters.eq("filterField", true); body.add(filterField); BsonDocument updateObj = new BsonDocument().append("$set", new BsonDocument("scientist", new BsonString("Darwin"))); body.add(updateObj); Object result = template.requestBodyAndHeader("direct:update", body, MongoDbConstants.MULTIUPDATE, true);
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update"); Maps<String, Object> headers = new HashMap<>(2); headers.add(MongoDbConstants.MULTIUPDATE, true); headers.add(MongoDbConstants.FIELDS_FILTER, Filters.eq("filterField", true)); String updateObj = Updates.set("scientist", "Darwin");; Object result = template.requestBodyAndHeaders("direct:update", updateObj, headers);
// route: from("direct:update").to("mongodb:myDb?database=science&collection=notableScientists&operation=update"); String updateObj = "[{\"filterField\": true}, {\"$set\", {\"scientist\", \"Darwin\"}}]"; Object result = template.requestBodyAndHeader("direct:update", updateObj, MongoDbConstants.MULTIUPDATE, true);