34.7.2.3. update
更新集合上的一个或多个记录。需要过滤器查询和更新规则。
您可以使用 MongoDBConstants.CRITERIA 标头定义为 Bson
,并将更新规则定义为 Body 中的 Bson
。
更新完成后,
虽然使用 MongoDBConstants.CRITERIA 标头作为 Bson
在进行更新前查询 mongodb,您应该注意到您在聚合过程中生成的 camel 交换过程中需要将其从生成的 camel 交换中删除,然后应用 mongodb 更新。如果您在聚合和/或重新定义 MongoDBConstants.CRITERIA 标头期间没有删除这个标头,则在发送 camel Exchange to mongodb producer 端点之前,您可能会在更新 mongodb 时出现无效的 camel Exchange payload。
第二种方法是将 List<Bson> 用作包含 2 项的 IN 消息正文:
- 元素 1(index 0)IFL 过滤器查询 apiVersion 决定哪些对象会受到影响,这与典型的查询对象相同
- 元素 2(index 1)IFL 更新规则 >_< 如何更新匹配的对象。支持 MongoDB 中的所有 修饰符操作。
Multiupdates
By 默认将只更新 1 对象,即使多个对象与过滤器查询匹配。要指示 MongoDB 更新所有 匹配记录,将 CamelMongoDbMultiUpdate
IN 消息标题设置为 true
。
带有密钥 CamelMongoDbRecords 受影响的
标头(带有更新的记录数的MongoDbConstants.RECORDS_AFFECTED
constant)被更新(由 WriteResult.getN()
生成)。
支持以下 IN 消息标头:
标头密钥 | 快速持续 | 描述(从 MongoDB API doc中提取) | 预期类型 |
---|---|---|---|
|
| 如果更新应应用于所有匹配对象。See http://www.mongodb.org/display/DOCS/Atomic+Operations | boolean/Boolean |
|
| 如果数据库应该创建这个元素(如果不存在) | boolean/Boolean |
例如,以下命令将 filterField 字段的值设为 "Darwin" 字段的值来更新其 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);