S agregací je celý dotaz spuštěn jako jeden proces na serveru MongoDB - aplikační program získá kurzor výsledků ze serveru.
S programem Java také získáváte kurzor z databázového serveru jako vstup pro zpracování v aplikaci. Kurzor odpovědi ze serveru bude obsahovat větší sadu dat a bude využívat větší šířku pásma sítě. A pak je zde zpracování v aplikačním programu, což přidává další kroky k dokončení dotazu.
Myslím, že možnost agregace je lepší volbou - protože veškeré zpracování (počáteční shoda a filtrování pole) probíhá na databázovém serveru jako jeden proces.
Všimněte si také, že kroky agregačního dotazu, které jste zveřejnili, lze provést efektivně. Místo několika fází (2, 3, 4 a 5) můžete tyto operace provádět ve dvou fázích - použijte $project
pomocí $map
na vnějším poli a poté $filter
na vnitřní pole a potom $filter
vnější pole.
Agregace:
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 ] }
}
}
}
},
] )