38.7. MongoDB 操作 - プロデューサーエンドポイント
38.7.1. クエリー操作 リンクのコピーリンクがクリップボードにコピーされました!
38.7.1.1. findById リンクのコピーリンクがクリップボードにコピーされました!
この操作は、_id フィールドが IN メッセージ本文の内容と一致するコレクションから 1 つの要素のみを取得します。着信オブジェクトは、Bson 型と同等のものであれば何でもかまいません。http://bsonspec.org/spec.html および http://www.mongodb.org/display/DOCS/Java+Types を参照してください。
from("direct:findById")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
デフォルトの _id は Mongo によって ObjectId タイプとして扱われるため、適切に変換する必要がある場合があることに注意してください。
from("direct:findById")
.convertBodyTo(ObjectId.class)
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
オプションのパラメーターをサポート
この操作は射影演算子をサポートしています。フィールドフィルターの指定 (プロジェクション) を参照。
38.7.1.2. findOneByQuery リンクのコピーリンクがクリップボードにコピーされました!
MongoDB クエリーセレクターに一致するコレクションから最初の要素を取得します。CamelMongoDbCriteria ヘッダーが設定されている場合、その値はクエリーセレクターとして使用されます。CamelMongoDbCriteria ヘッダーが null の場合、IN メッセージ本文がクエリーセレクターとして使用されます。どちらの場合も、クエリーセレクターは Bson 型であるか、Bson に変換可能である必要があります (たとえば、JSON 文字列または HashMap)。詳細については、型変換を参照してください。
MongoDB ドライバーが提供する Filters を使用して、クエリーセレクターを作成します。
38.7.1.3. クエリーセレクターを使用しない例 (コレクション内の最初のドキュメントを返します) リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findOneByQuery")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
38.7.1.4. クエリーセレクターを使用した例 (コレクション内で最初に一致したドキュメントを返します): リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findOneByQuery")
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani")))
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
オプションのパラメーターをサポート
この操作は、射影演算子とソート句をサポートしています。フィールドフィルター (射影) の指定、並べ替え句の指定を参照してください。
38.7.1.5. findAll リンクのコピーリンクがクリップボードにコピーされました!
findAll オペレーションは、クエリーに一致するすべてのドキュメントを返すか、またはまったく一致しないドキュメントを返します。この場合、コレクションに含まれるすべてのドキュメントが返されます。クエリーオブジェクトは CamelMongoDbCriteria ヘッダーから抽出されます。CamelMongoDbCriteria ヘッダーが null の場合、クエリーオブジェクトは抽出されたメッセージ本文です。つまり、タイプ Bson であるか、または Bson に変換可能である必要があります。JSON 文字列または Hashmap にすることができます。詳細については、型変換を参照してください。
38.7.1.5.1. クエリーセレクターを使用しない例 (コレクション内のすべてのドキュメントを返します) リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findAll")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
38.7.1.5.2. クエリーセレクターを使用した例 (コレクション内の一致するすべてのドキュメントを返します) リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findAll")
.setHeader(MongoDbConstants.CRITERIA, Filters.eq("name", "Raul Kripalani"))
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
ページングと効率的な検索は、次のヘッダーを介してサポートされています。
| ヘッダーのキー | クイック定数 | 説明 (MongoDB API ドキュメントから抜粋) | 想定されるタイプ |
|---|---|---|---|
|
|
| カーソルの先頭にある指定された数の要素を破棄します。 | int/Integer |
|
|
| 返される要素の数を制限します。 | int/Integer |
|
|
| 1 つのバッチで返される要素の数を制限します。通常、カーソルは結果オブジェクトのバッチをフェッチし、ローカルに保存します。batchSize が正の場合、取得されたオブジェクトの各バッチのサイズを表します。パフォーマンスを最適化し、データ転送を制限するように調整できます。batchSize が負の場合、最大バッチサイズ制限 (通常は 4MB) 内に収まる数のオブジェクトが返され、カーソルが閉じられます。たとえば、batchSize が -10 の場合、サーバーは最大 10 個のドキュメントを 4MB に収まる数だけ返し、カーソルを閉じます。この機能は、ドキュメントが最大サイズ内に収まる必要があるという点で limit() とは異なり、サーバー側でカーソルを閉じる要求を送信する必要がないことに注意してください。バッチサイズは、カーソルが反復された後でも変更できます。その場合、設定は次のバッチ取得に適用されます。 | int/Integer |
|
|
| allowDiskUse MongoDB フラグを設定します。これは、MongoDB Server 4.3.1 以降でサポートされています。このヘッダーを古い MongoDB サーバーバージョンで使用すると、クエリーが失敗する可能性があります。 | boolean/Boolean |
38.7.1.5.3. オプション outputType=MongoIterable とバッチサイズの例 リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findAll")
.setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani")))
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=MongoIterable")
.to("mock:resultFindAll");
ページングを使用している場合、findAll 操作は次の OUT ヘッダーも返し、結果ページを反復処理できるようにします。
| ヘッダーのキー | クイック定数 | 説明 (MongoDB API ドキュメントから抜粋) | データのタイプ |
|---|---|---|---|
|
|
| クエリーに一致するオブジェクトの数。これは、制限/スキップを考慮していません。 | int/Integer |
|
|
| クエリーに一致するオブジェクトの数。これは、制限/スキップを考慮していません。 | int/Integer |
オプションのパラメーターをサポート
この操作は、射影演算子とソート句をサポートしています。フィールドフィルター (射影) の指定、並べ替え句の指定を参照してください。
38.7.1.6. count リンクのコピーリンクがクリップボードにコピーされました!
コレクション内のオブジェクトの総数を返し、OUT メッセージ本文として Long を返します。
次の例では、dynamicCollectionName コレクション内のレコード数をカウントします。動的性が有効になっていることに注意してください。その結果、操作は "notableScientists" コレクションではなく、"dynamicCollectionName" コレクションに対して実行されます。
// from("direct:count").to("mongodb:myDb?database=tickets&collection=flights&operation=count&dynamicity=true");
Long result = template.requestBodyAndHeader("direct:count", "irrelevantBody", MongoDbConstants.COLLECTION, "dynamicCollectionName");
assertTrue("Result is not of type Long", result instanceof Long);
クエリーを提供でき ますクエリーオブジェクトは CamelMongoDbCriteria ヘッダーから抽出されます。CamelMongoDbCriteria ヘッダーが null の場合、クエリーオブジェクトは抽出されたメッセージ本文です。つまり、タイプ Bson または Bson に変換可能である必要があり、操作はこの条件に一致するドキュメントの量を返します。
Document query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
38.7.1.7. フィールドフィルターの指定 (プロジェクション) リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、クエリー操作は、一致するオブジェクト全体を (すべてのフィールドとともに) 返します。ドキュメントが大きく、フィールドのサブセットのみを取得する必要がある場合は、関連する Bson (または JSON 文字列、マップなどの Bson に変換可能な型) を設定するだけで、すべてのクエリー操作でフィールドフィルターを指定できます。) CamelMongoDbFieldsProjection ヘッダーの定数ショートカット: MongoDbConstants.FIELDS_PROJECTION。
これは、MongoDB の Projections を使用して Bson の作成を簡素化する例です。_id と boringField を除くすべてのフィールドを取得します。
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
これは、MongoDB の Projections を使用して Bson の作成を簡素化する例です。_id と boringField を除くすべてのフィールドを取得します。
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson fieldProjection = Projection.exclude("_id", "boringField");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.FIELDS_PROJECTION, fieldProjection);
38.7.1.8. ソート句の指定 リンクのコピーリンクがクリップボードにコピーされました!
Bson の作成を簡素化するために、MongoDB の Sorts を使用する特定のフィールドによるソートに基づいて、コレクションから最小/最大レコードを取得する必要があることがよくあります。_id と boringField を除くすべてのフィールドを取得します。
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
Bson sorts = Sorts.descending("_id");
Object result = template.requestBodyAndHeader("direct:findAll", ObjectUtils.NULL, MongoDbConstants.SORT_BY, sorts);
Camel ルートでは、SORT_BY ヘッダーを findOneByQuery 操作で使用して、同じ結果を得ることができます。FIELDS_PROJECTION ヘッダーも指定されている場合、操作は、別のコンポーネント (たとえば、パラメーター化された MyBatis SELECT クエリー) に直接渡すことができる単一のフィールド/値のペアを返します。この例では、コレクションから一時的に最新のドキュメントをフェッチし、結果を documentTimestamp フィールドに基づいて 1 つのフィールドに削減する方法を示します。
.from("direct:someTriggeringEvent")
.setHeader(MongoDbConstants.SORT_BY).constant(Sorts.descending("documentTimestamp"))
.setHeader(MongoDbConstants.FIELDS_PROJECTION).constant(Projection.include("documentTimestamp"))
.setBody().constant("{}")
.to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery")
.to("direct:aMyBatisParameterizedSelect");