Với Aggregation, toàn bộ truy vấn được thực thi như một quá trình duy nhất trên máy chủ MongoDB - chương trình ứng dụng sẽ nhận được con trỏ kết quả từ máy chủ.
Với chương trình Java, bạn cũng nhận được một con trỏ từ máy chủ cơ sở dữ liệu làm đầu vào cho quá trình xử lý trong ứng dụng. Con trỏ phản hồi từ máy chủ sẽ là tập dữ liệu lớn hơn và sẽ sử dụng nhiều băng thông mạng hơn. Và sau đó là quá trình xử lý trong chương trình ứng dụng và điều này bổ sung thêm các bước để hoàn thành truy vấn.
Tôi nghĩ rằng tùy chọn tổng hợp là một lựa chọn tốt hơn - vì tất cả quá trình xử lý (đối sánh ban đầu và lọc mảng) xảy ra trên máy chủ cơ sở dữ liệu như một quy trình duy nhất.
Ngoài ra, hãy lưu ý rằng các bước truy vấn tổng hợp bạn đã đăng có thể được thực hiện một cách hiệu quả. Thay vì nhiều giai đoạn (2, 3, 4 và 5), bạn có thể thực hiện các thao tác đó trong hai giai đoạn - sử dụng $project
với $map
trên mảng bên ngoài và sau đó là $filter
trên mảng bên trong và sau đó $filter
mảng bên ngoài.
Tổng hợp:
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 ] }
}
}
}
},
] )