С Aggregation цялата заявка се изпълнява като един процес на MongoDB сървъра - приложната програма ще получи курсора на резултатите от сървъра.
С програмата Java също получавате курсор от сървъра на базата данни като вход за обработката в приложението. Курсорът за отговор от сървъра ще бъде по-голям набор от данни и ще използва повече честотна лента на мрежата. След това има обработка в приложната програма и това добавя още стъпки за завършване на заявката.
Мисля, че опцията за агрегиране е по-добър избор - тъй като цялата обработка (първоначалното съвпадение и филтриране на масива) се случва на сървъра на базата данни като един процес.
Също така имайте предвид, че публикуваните от вас стъпки на заявка за агрегиране могат да бъдат направени по ефективен начин. Вместо няколко етапа (2, 3, 4 и 5), можете да извършите тези операции на два етапа - използвайте $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 ] }
}
}
}
},
] )