С 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 ] }
}
}
}
},
] )