Bei der Aggregation wird die gesamte Abfrage als ein einziger Prozess auf dem MongoDB-Server ausgeführt – das Anwendungsprogramm erhält den Ergebnis-Cursor vom Server.
Mit dem Java-Programm erhalten Sie auch einen Cursor vom Datenbankserver als Eingabe für die Verarbeitung in der Anwendung. Der Antwort-Cursor vom Server wird ein größerer Datensatz sein und mehr Netzwerkbandbreite verwenden. Und dann gibt es eine Verarbeitung im Anwendungsprogramm, und dies fügt weitere Schritte hinzu, um die Abfrage zu vervollständigen.
Ich denke, die Aggregationsoption ist eine bessere Wahl, da die gesamte Verarbeitung (der anfängliche Abgleich und das Filtern des Arrays) auf dem Datenbankserver als ein einziger Prozess erfolgt.
Beachten Sie auch, dass die von Ihnen geposteten Aggregationsabfrageschritte auf effiziente Weise durchgeführt werden können. Anstelle von mehreren Stufen (2, 3, 4 und 5) können Sie diese Operationen in zwei Stufen durchführen - Verwenden Sie ein $project
mit $map
auf dem äußeren Array und dann $filter
auf dem inneren Array and then $filter
das äußere Array.
Die Aggregation:
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 ] }
}
}
}
},
] )