Met Aggregation wordt de hele query uitgevoerd als een enkel proces op de MongoDB-server - het applicatieprogramma haalt de resultatencursor van de server.
Met Java-programma krijg je ook een cursor van de databaseserver als invoer voor de verwerking in de applicatie. De responscursor van de server wordt een grotere set gegevens en gebruikt meer netwerkbandbreedte. En dan is er verwerking in het applicatieprogramma, en dit voegt meer stappen toe om de vraag te voltooien.
Ik denk dat de aggregatie-optie een betere keuze is - omdat alle verwerking (de eerste match en het filteren van de array) op de databaseserver plaatsvindt als een enkel proces.
Houd er ook rekening mee dat de aggregatiequerystappen die u had gepost op een efficiënte manier kunnen worden uitgevoerd. In plaats van meerdere fasen (2, 3, 4 en 5) kunt u die bewerkingen in twee fasen uitvoeren - gebruik een $project
met $map
op de buitenste array en vervolgens $filter
op de binnenste array en dan $filter
de buitenste array.
De aggregatie:
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 ] }
}
}
}
},
] )