38.7.2.3. update
コレクションの 1 つまたは複数のレコードを更新します。フィルタークエリーと更新ルールが必要です。
MongoDBConstants.CRITERIA ヘッダーを使用してフィルターを Bson
として定義し、更新ルールを本文で Bson
として定義できます。
エンリッチ後の更新Bson
として MongoDBConstants.CRITERIA ヘッダーを使用してフィルターを定義し、更新前に mongodb にクエリーを実行する際に、集約ストラテジーでエンリッチパターンを使用してから mongodb 更新を適用する場合に、集約中に結果の camel エクスチェンジからフィルターを削除する必要があることに注意してください。集約中にこのヘッダーを削除しない場合、および/または camel エクスチェンジを mongodb プロデューサーエンドポイントに送信する前に MongoDBConstants.CRITERIA ヘッダーを再定義しない場合、mongodb の更新中に無効なcamel エクスチェンジペイロードが発生する可能性があります。
2 番目の方法は、正確に 2 つの要素を含む IN メッセージボディーとして List<Bson> を要求します。
- 要素 1 (インデックス 0) ⇒ フィルタークエリー ⇒ 通常のクエリーオブジェクトと同じように、影響を受けるオブジェクトを決定します
- 要素 2 (インデックス 1) ⇒ 更新ルール ⇒ 一致したオブジェクトがどのように更新されるか。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" に設定することで、filterField フィールドが true に等しい すべての レコードを更新します。
// 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);
// 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);