Aggregationを使用すると、クエリ全体がMongoDBサーバー上で単一のプロセスとして実行されます。アプリケーションプログラムはサーバーから結果カーソルを取得します。
Javaプログラムを使用すると、アプリケーションの処理への入力としてデータベースサーバーからカーソルを取得することもできます。サーバーからの応答カーソルは、より大きなデータセットになり、より多くのネットワーク帯域幅を使用します。そして、アプリケーションプログラムで処理が行われ、クエリを完了するための手順がさらに追加されます。
すべての処理(最初の一致と配列のフィルタリング)はデータベースサーバー上で単一のプロセスとして行われるため、集計オプションの方が適していると思います。
また、投稿した集計クエリの手順は効率的な方法で実行できることに注意してください。複数のステージ(2、3、4、および5)の代わりに、これらの操作を2つのステージで実行できます。 -$project
を使用します $map
を使用 外側の配列で$filter
内側の配列でそして $filter
外側の配列。
集計:
db.test.aggregate( [
{
$addFields: {
Field2: {
$map: {
input: "$Field2",
as: "fld2",
in: {
Field3: "$$fld2.Field3",
Field4: {
$filter: {
input: "$$fld2.Field4",
as: "fld4",
cond: { $eq: [ "$$fld4.id", "123" ] }
}
}
}
}
}
}
},
{
$addFields: {
Field2: {
$filter: {
input: "$Field2",
as: "f2",
cond: { $gt: [ { $size: "$$f2.Field4" }, 0 ] }
}
}
}
},
] )