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") ;