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 文档中提取)预期类型

CamelMongoDbMultiUpdate

MongoDbConstants.MULTIUPDATE

如果更新应当应用到与所有对象匹配的所有对象。请参阅 http://www.mongodb.org/display/DOCS/Atomic+Operations

boolean/Boolean

CamelMongoDbUpsert

MongoDbConstants.UPSERT

如果数据库应该创建元素(如果不存在)

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);
Red Hat logoGithubRedditYoutube

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.