Có một số cách tiếp cận khác nhau mà bạn có thể sử dụng tại đây:
-
Sử dụng bản đồ / thu nhỏ:không làm điều này. Ngay bây giờ, việc chạy khung tổng hợp sẽ nhanh hơn gấp 3 lần so với việc sử dụng chức năng thu gọn bản đồ cho trường hợp sử dụng này.
-
Chạy tổng hợp 3 lần. Đây không phải là tối ưu, nhưng nếu bạn không bị hạn chế về thời gian thì đây là lựa chọn dễ dàng nhất. Nếu quá trình tổng hợp của bạn vẫn mất
-
Đây là công việc tốt nhất mà tôi có thể nghĩ ra.
$group
toán tử cho phép bạn tạo_id
trên nhiều trường. Ví dụ.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. Làm điều này sẽ tạo một nhóm cho tất cả các tổ hợp phím khác nhau hiện có của bạn. Bạn có thể nhóm các khóa của mình theo cách này và sau đó tổng hợp theo cách thủ công trên các kết quả trong ứng dụng khách.
Hãy để tôi nói rõ hơn. Giả sử chúng ta có một bộ sưu tập các hình dạng. Những hình dạng này có thể có màu sắc, kích thước và loại (hình vuông, hình tròn, v.v.). Tổng hợp trên Id nhiều khóa có thể giống như sau:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
và trả lại:
"result" : [
{
"_id" : {
"f1" : "yellow",
"f2" : "medium",
"f3" : "triangle"
},
"count" : 4086
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4138
},
{
"_id" : {
"f1" : "red",
"f2" : "big",
"f3" : "square"
},
"count" : 4113
},
{
"_id" : {
"f1" : "yellow",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4145
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "square"
},
"count" : 4062
}
... và như vậy
Sau đó, bạn sẽ tổng hợp các kết quả ở phía máy khách, với số lượng mục nhập giảm đáng kể. Giả sử số lượng giá trị duy nhất cho mỗi khóa đủ nhỏ so với tổng số tài liệu, bạn có thể thực hiện bước cuối cùng này trong một khoảng thời gian không đáng kể.