216.5. MongoDB 操作 - プロデューサーエンドポイント
216.5.1. クエリー操作 リンクのコピーリンクがクリップボードにコピーされました!
216.5.1.1. findById リンクのコピーリンクがクリップボードにコピーされました!
この操作は、_id フィールドが IN メッセージボディーの内容と一致するコレクションから 1 つの要素のみを取得します。受信オブジェクトは、BSON タイプと同等のものをすべて使用できます。http://bsonspec.org//specification[http://bsonspec.org//specification] および http://www.mongodb.org/display/DOCS/Java+Types を参照してください。
from("direct:findById")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findById")
.to("mock:resultFindById");
オプションのパラメーター をサポートします。この操作は、フィールドフィルターの指定をサポートします。「 オプションのパラメーターの指定 」を参照してください。
216.5.1.2. findOneByQuery リンクのコピーリンクがクリップボードにコピーされました!
この操作を使用して、MongoDB クエリーに一致するコレクションから 1 つの要素のみを取得します。クエリーオブジェクトは IN メッセージボディーから抽出 さ れ ます。JSON String または Hashmap を使用できます。詳細は 、「タイプ変換 」を参照してください。
クエリーのない例(コレクションのオブジェクトを返します)。
from("direct:findOneByQuery")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
クエリーを使用する例(一致する 1 つの結果を返す):
from("direct:findOneByQuery")
.setBody().constant("{ \"name\": \"Raul Kripalani\" }")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery")
.to("mock:resultFindOneByQuery");
オプションのパラメーター をサポートします。この操作は、フィールドフィルターや sort 句の指定をサポートします。「 オプションのパラメーターの指定 」を参照してください。
216.5.1.3. findAll リンクのコピーリンクがクリップボードにコピーされました!
findAll 操作は、クエリーに一致するドキュメントをすべて返します。そうでない場合は、コレクションに含まれるすべてのドキュメントが返されます。クエリーオブジェクトは IN メッセージボディーから抽出 さ れ ます。JSON String または Hashmap を使用できます。詳細は 、「タイプ変換 」を参照してください。
クエリーなしの例(コレクション内のすべてのオブジェクトを返します)。
from("direct:findAll")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
.to("mock:resultFindAll");
クエリーを使用する例(一致するすべての結果を返します)。
from("direct:findAll")
.setBody().constant("{ \"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 |
また、上記のヘッダーを設定するよりも簡単なエンドポイントオプションとして outputType=DBCursor(Camel 2.16+)を含めることで、サーバーからルートへ返されたドキュメントを「ストリーム」することもできます。これにより、Mongo シェルで findAll()を実行していたのと同様に、Mongo ドライバーから DBCursor が操作し、ルートが結果を繰り返し処理できるようになります。デフォルトでは、このオプションがないと、このコンポーネントはドライバーのカーソルから List にドキュメントを読み込んで、ルートに戻ります。これにより、多数のインメモリーオブジェクトが発生する可能性があります。DBCursor を使用すると、一致するドキュメントの数が尋ねられない点に注意してください。詳細は、MongoDB のドキュメントサイトを参照してください。
outputType=DBCursor および batch size オプションを使用する例:
from("direct:findAll")
.setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
.setBody().constant("{ \"name\": \"Raul Kripalani\" }")
.to("mongodb:myDb?database=flights&collection=tickets&operation=findAll&outputType=DBCursor")
.to("mock:resultFindAll");
findAll 操作は、ページングを使用している場合に結果ページを繰り返し処理できるように、以下の OUT ヘッダーも返します。
| ヘッダーキー | クイック定数 | 説明(MongoDB API ドキュメントから抽出) | データ型 |
|---|---|---|---|
|
|
| クエリーに一致するオブジェクトの数。これには制限や省略は行われません。 | int/Integer |
|
|
| クエリーに一致するオブジェクトの数。これには制限や省略は行われません。 | int/Integer |
オプションのパラメーター をサポートします。この操作は、フィールドフィルターや sort 句の指定をサポートします。「 オプションのパラメーターの指定 」を参照してください。
216.5.1.4. 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);
Camel 2.14 以降では、メッセージボディーにクエリーとして com.mongodb.DBObject オブジェクトを指定でき、操作はこの条件に一致するドキュメントの量を返します。
DBObject query = ...
Long count = template.requestBodyAndHeader("direct:count", query, MongoDbConstants.COLLECTION, "dynamicCollectionName");
216.5.1.5. フィールドフィルター(プロジェクト)の指定 リンクのコピーリンクがクリップボードにコピーされました!
クエリー操作は、デフォルトで(すべてのフィールドを含む)一致するオブジェクトを完全に返します。ドキュメントが大きい場合に、フィールドのサブセットのみを取得する必要がある場合は、CamelMongoDbFieldsFilter ヘッダーで関連する DBObject (または JSON 文字列、マップなど)を DBObject に設定するだけで、すべてのクエリー操作でフィールドフィルターを指定 できます。
以下は、MongoDB の BasicDBObjectBuilder を使用して DBObject の作成を単純化する例です。これは、_id および boringField を除くすべてのフィールドを取得します。
// route: from("direct:findAll").to("mongodb:myDb?database=flights&collection=tickets&operation=findAll")
DBObject fieldFilter = BasicDBObjectBuilder.start().add("_id", 0).add("boringField", 0).get();
Object result = template.requestBodyAndHeader("direct:findAll", (Object) null, MongoDbConstants.FIELDS_FILTER, fieldFilter);
216.5.1.6. sort 句の指定 リンクのコピーリンクがクリップボードにコピーされました!
特定のフィールドで並び替えに基づき、コレクションから min/max レコードを取得する必要がしばしばあります。Mongo では、以下のような構文を使用して操作が実行されます。
db.collection.find().sort({_id: -1}).limit(1)
// or
db.collection.findOne({$query:{},$orderby:{_id:-1}})
Camel ルートでは、SORT_BY ヘッダーを findOneByQuery 操作とともに使用して、同じ結果を得ることができます。FIELDS_FILTER ヘッダーも指定された場合、操作は別のコンポーネントに直接渡すことができる単一のフィールド/値のペアを返します(パラメーター化された MyBatis SELECT クエリーなど)。以下の例は、コレクションから一時的な最新ドキュメントを取得し、documentTimestamp フィールドに基づいて結果を 1 つのフィールドに減らす方法を示しています。
.from("direct:someTriggeringEvent")
.setHeader(MongoDbConstants.SORT_BY).constant("{\"documentTimestamp\": -1}")
.setHeader(MongoDbConstants.FIELDS_FILTER).constant("{\"documentTimestamp\": 1}")
.setBody().constant("{}")
.to("mongodb:myDb?database=local&collection=myDemoCollection&operation=findOneByQuery")
.to("direct:aMyBatisParameterizedSelect")
;