Com Agregação, toda a consulta é executada como um único processo no servidor MongoDB - o programa aplicativo obterá o cursor de resultados do servidor.
Com o programa Java também você está recebendo um cursor do servidor de banco de dados como entrada para o processamento no aplicativo. O cursor de resposta do servidor será um conjunto maior de dados e usará mais largura de banda da rede. E então há processamento no programa aplicativo, e isso adiciona mais etapas para concluir a consulta.
Acho que a opção de agregação é a melhor escolha - já que todo o processamento (a correspondência inicial e a filtragem do array) acontece no servidor de banco de dados como um único processo.
Além disso, observe que as etapas de consulta de agregação que você postou podem ser feitas de maneira eficiente. Em vez de vários estágios (2, 3, 4 e 5), você pode fazer essas operações em dois estágios - use um
$project
com $map
no array externo e então $filter
no array interno e então $filter
a matriz externa.A agregação:
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 ] }
}
}
}
},
] )