35.7.5. その他の操作
35.7.5.1. aggregate リンクのコピーリンクがクリップボードにコピーされました!
ボディーに含まれる指定のパイプラインで集約を実行します。集約は長く重い操作になる可能性があります。注意して使用してください。
// route: from("direct:aggregate").to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate");
List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist",
group("$scientist", sum("count", 1)));
from("direct:aggregate")
.setBody().constant(aggregate)
.to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate")
.to("mock:resultAggregate");
次の IN メッセージヘッダーをサポートします。
| ヘッダーのキー | クイック定数 | 説明 (MongoDB API ドキュメントから抜粋) | 想定されるタイプ |
|---|---|---|---|
|
|
| バッチごとに返すドキュメントの数を設定します。 | int/Integer |
|
|
| 集約パイプラインステージを有効にして、データを一時ファイルに書き込みます。 | boolean/Boolean |
デフォルトでは、すべての結果のリストが返されます。これは、結果のサイズによってはメモリーに大きくなる可能性があります。より安全な代替手段は、outputType=MongoIterable を設定することです。次のプロセッサーでは、メッセージ本文に iterable が表示されます。これにより、結果を 1 つずつステップスルーできます。したがって、バッチサイズを設定し、反復可能を返すと、結果を効率的に取得および処理できます。
以下に例を示します。
List<Bson> aggregate = Arrays.asList(match(or(eq("scientist", "Darwin"), eq("scientist",
group("$scientist", sum("count", 1)));
from("direct:aggregate")
.setHeader(MongoDbConstants.BATCH_SIZE).constant(10)
.setBody().constant(aggregate)
.to("mongodb:myDb?database=science&collection=notableScientists&operation=aggregate&outputType=MongoIterable")
.split(body())
.streaming()
.to("mock:resultAggregate");
.split (body () )を呼び出すと、ルートを 1 つずつダウンしてエントリーを送信するだけで十分ですが、最初にすべてのエントリーをメモリーにロードすることに注意してください。そのため、.streaming () を呼び出して、バッチでデータをメモリーに読み込む必要があります。