Con Aggregation, l'intera query viene eseguita come un unico processo sul server MongoDB:il programma applicativo otterrà il cursore dei risultati dal server.
Con il programma Java si ottiene anche un cursore dal server del database come input per l'elaborazione nell'applicazione. Il cursore di risposta dal server sarà un insieme di dati più ampio e utilizzerà più larghezza di banda di rete. E poi c'è l'elaborazione nel programma applicativo e questo aggiunge più passaggi per completare la query.
Penso che l'opzione di aggregazione sia una scelta migliore, poiché tutta l'elaborazione (la corrispondenza iniziale e il filtraggio dell'array) avviene sul server di database come un unico processo.
Inoltre, tieni presente che i passaggi della query di aggregazione che hai pubblicato possono essere eseguiti in modo efficiente. Invece di più fasi (2, 3, 4 e 5) puoi eseguire queste operazioni in due fasi - usa un $project
con $map
sull'array esterno e poi $filter
sull'array interno e poi $filter
l'array esterno.
L'aggregazione:
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 ] }
}
}
}
},
] )