Med aggregation exekveras hela frågan som en enda process på MongoDB-servern - applikationsprogrammet hämtar resultatmarkören från servern.
Med Java-program får du också en markör från databasservern som input till bearbetningen i applikationen. Svarsmarkören från servern kommer att vara en större uppsättning data och kommer att använda mer nätverksbandbredd. Och sedan finns det bearbetning i applikationsprogrammet, och detta lägger till fler steg för att slutföra frågan.
Jag tror att aggregeringsalternativet är ett bättre val - eftersom all bearbetning (den initiala matchningen och filtrering av arrayen) sker på databasservern som en enda process.
Notera också att stegen för aggregering av frågeställningar som du har lagt upp kan göras på ett effektivt sätt. Istället för flera steg (2, 3, 4 och 5) kan du göra dessa operationer i två steg - använd ett $project
med $map
på den yttre arrayen och sedan $filter
på den inre arrayen och sedan $filter
den yttre arrayen.
Sammanställningen:
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 ] }
}
}
}
},
] )