218.5.2.3. 更新
コレクションで 1 つまたは複数のレコードを更新します。フィルタークエリーと更新ルールが必要です。
MongoDBConstants.CRITERIA ヘッダーを Bson
として定義し、更新ルールを Body に Bson
として定義できます。
2 つ目の方法は、完全 2 つの要素が含まれる IN メッセージボディーとして List<Bson> を必要とする方法です。
- 要素 1(インデックス 0)pid フィルタークエリー gitops は、通常のクエリーオブジェクトと同じように、影響を受けるオブジェクトを決定します。
- 要素 2(インデックス 1)pid 更新ルールは、一致したオブジェクトの更新方法。MongoDB の すべての修飾子操作 がサポートされます。
Multiupdates。デフォルトでは、MongoDB は複数のオブジェクトがフィルタークエリーに一致する場合でも 1 つのオブジェクトのみを更新します。MongoDB に対して一致する すべて のレコードを更新するように指示するには、CamelMongoDbMultiUpdate
IN メッセージヘッダーを true
に設定します。
CamelMongoDbRecordsAffected
キーのあるヘッダー(MongoDbConstants.RECORDS_AFFECTED
定数)と更新されたレコード( WriteResult.getN()から派生)を返します。
以下の IN メッセージヘッダーをサポートします。
ヘッダーキー | クイック定数 | 説明(MongoDB API ドキュメントから抽出) | 想定されるタイプ |
---|---|---|---|
|
| If the update to apply all objects matching.See http://www.mongodb.org/display/DOCS/Atomic+Operations | boolean/Boolean |
|
| 要素が存在しない場合にデータベースが要素を作成するべきかどうか | boolean/Boolean |
たとえば、以下では "scientist" フィールドの値を "Darwin" に設定して、filterField フィールドが true である すべて のレコードを更新します。
// route: from("direct:update").to("mongodb3:myDb?database=science&collection=notableScientists&operation=update"); Bson filterField = Filters.eq("filterField", true); String updateObj = Updates.set("scientist", "Darwin"); Object result = template.requestBodyAndHeader("direct:update", new Bson[] {filterField, Document.parse(updateObj)}, MongoDbConstants.MULTIUPDATE, true);
// route: from("direct:update").to("mongodb3: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("mongodb3:myDb?database=science&collection=notableScientists&operation=update"); String updateObj = "[{\"filterField\": true}, {\"$set\", {\"scientist\", \"Darwin\"}}]"; Object result = template.requestBodyAndHeader("direct:update", updateObj, MongoDbConstants.MULTIUPDATE, true);