35.7.2.3. update
コレクションの 1 つまたは複数のレコードを更新します。フィルタークエリーおよび更新ルールが必要です。
MongoDBConstants.CRITERIA ヘッダーを Bson として使用してフィルターを定義し、更新ルールを Body で Bson として定義できます。
補完後の更新
は、MongoDBConstants.CRITERIA ヘッダーを Bson として使用して更新を実行する前に mongodb のクエリーを行いながら、集約ストラテジーで補完パターンを使用し、mongodb 更新を適用する場合は、集計時に生成される Camel エクスチェンジからフィルターを削除する必要がある点に注意してください。集約中にこのヘッダーを削除したり、mongodb プロデューサーエンドポイントに Camel エクスチェンジを送信する前に MongoDBConstants.CRITERIA ヘッダーを再定義しない場合、mongodb の更新中に無効な camel エクスチェンジペイロードで終了する可能性があります。
2 つ目の方法では、2 つの要素が含まれる IN メッセージボディーとして List<Bson> が必要になります。
- 要素 1 (インデックス 0)(インデックス 0)フィルタークエリー NORMAL は、通常のクエリーオブジェクトと同様に、影響を受けるオブジェクトを決定します。
- 要素 2 (インデックス 1)は、一致したオブジェクトの更新方法、更新方法に関するルールです。MongoDB からの 修飾子操作 はすべてサポートされます。
Multiupdates
デフォルトでは、MongoDB は複数のオブジェクトがフィルタークエリーと一致する場合でも 1 つのオブジェクトのみを更新します。一致する すべて のレコードを更新するよう MongoDB に指示するには、CamelMongoDbMultiUpdate IN メッセージヘッダーを true に設定します。
キーの CamelMongoDbRecordsAffected のあるヘッダーは、更新されたレコードの数( WriteResult.getN ()からコピー)を含むレコードの数とともに(
MongoDbConstants.RECORDS_AFFECTED 定数)を返します。
次の 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);