Dzięki agregacji całe zapytanie jest wykonywane jako pojedynczy proces na serwerze MongoDB - program aplikacji pobierze kursor wyników z serwera.
W programie Java otrzymujesz również kursor z serwera bazy danych jako dane wejściowe do przetwarzania w aplikacji. Kursor odpowiedzi z serwera będzie większym zestawem danych i będzie wykorzystywał większą przepustowość sieci. A potem następuje przetwarzanie w programie aplikacji, a to dodaje więcej kroków do zakończenia zapytania.
Myślę, że opcja agregacji jest lepszym wyborem - ponieważ całe przetwarzanie (wstępne dopasowanie i filtrowanie tablicy) odbywa się na serwerze bazy danych jako pojedynczy proces.
Zwróć też uwagę, że opublikowane przez Ciebie kroki agregacji zapytań można wykonać w wydajny sposób. Zamiast wielu etapów (2, 3, 4 i 5) możesz wykonać te operacje w dwóch etapach - użyj $project
z $map
na zewnętrznej tablicy, a następnie $filter
na tablicy wewnętrznej a potem $filter
zewnętrzna tablica.
Agregacja:
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 ] }
}
}
}
},
] )