35.7. MongoDB 操作 - プロデューサーエンドポイント
35.7.1. クエリー操作 リンクのコピーリンクがクリップボードにコピーされました!
35.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 は、ObjectId タイプおよび ObjectId タイプとして Mongo によって処理されるため、適切に変換する必要がある場合があります。
from("direct:findById")
.convertBodyTo(ObjectId.class)
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
オプションのパラメーターをサポートします
この操作はプロジェクション演算子をサポートします。Specifying a fields filter (projection) を参照してください。
35.7.1.2. findOneByQuery リンクのコピーリンクがクリップボードにコピーされました!
MongoDB クエリーセレクターに一致するコレクションから最初の要素を取得します。 CamelMongoDbCriteria ヘッダーが設定されている場合、その値がクエリーセレクター として使用され ます。CamelMongoDbCriteria ヘッダーが null の場合、IN メッセージボディーがクエリーセレクターとして使用されます。いずれの場合も、クエリーセレクターは Bson タイプであるか、Bson に変換できる必要があります(たとえば、JSON 文字列または HashMap)。詳細は、タイプ変換 を参照してください。
MongoDB ドライバーによって提供される フィルター を使用してクエリーセレクターを作成します。
35.7.1.3. クエリーセレクターのない例(コレクションの最初のドキュメントを返す) リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findOneByQuery")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
35.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");
オプションのパラメーター
をサポートします。この操作はプロジェクション演算子およびソート句をサポートします。Specifying a fields filter (projection) の Specifying a sort 句を参照してください。
35.7.1.5. findAll リンクのコピーリンクがクリップボードにコピーされました!
findAll 操作は、クエリーに一致するすべてのドキュメント、またはまったく none を返します。この場合、コレクションに含まれるすべてのドキュメントが返されます。クエリーオブジェクトは CamelMongoDbCriteria ヘッダーを抽出 します。CamelMongoDbCriteria ヘッダーが null の場合、クエリーオブジェクトは抽出されたメッセージボディーです。つまり、タイプ Bson であったり、Bson に変換できる必要があります。JSON 文字列または Hashmap にすることができます。詳細は、タイプ変換 を参照してください。
35.7.1.5.1. クエリーセレクターのない例(コレクション内のすべてのドキュメントを返す) リンクのコピーリンクがクリップボードにコピーされました!
from("direct:findAll")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
35.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 Server バージョンでこのヘッダーを使用すると、クエリーが失敗する可能性があります。 | boolean/Boolean |
35.7.1.5.3. outputType=MongoIterable オプションおよび batch size オプションを使用した例 リンクのコピーリンクがクリップボードにコピーされました!
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 |
オプションのパラメーター
をサポートします。この操作はプロジェクション演算子およびソート句をサポートします。Specifying a fields filter (projection) の Specifying a sort 句を参照してください。
35.7.1.6. count リンクのコピーリンクがクリップボードにコピーされました!
コレクション内のオブジェクトの合計数を返し、Long を OUT メッセージのボディーとして返します。
以下の例では、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");
35.7.1.7. フィールドフィルターの指定 (プロジェクション) リンクのコピーリンクがクリップボードにコピーされました!
クエリー操作は、デフォルトでは、(フィールドすべてとともに)一致するオブジェクトを完全に返します。ドキュメントのサイズが大きく、フィールドのサブセットのみを取得する必要がある場合は、CamelMongoDbFields .FIELDS_PROJECTION ヘッダーで関連する (または JSON String や Map など)を Bson に変換するだけで、すべてのクエリー操作でフィールドフィルターを指定できます。
Bson
以下は、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);
35.7.1.8. sort 句の指定 リンクのコピーリンクがクリップボードにコピーされました!
多くの場合、MongoDB の Sorts を使用して Bson の作成を簡素化する特定のフィールドによるソートに基づいて、最小/最大レコードを取得する必要があります。_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");