MongoDB đang phát triển nhanh chóng. Phiên bản 2.2 đã giới thiệu khung tổng hợp như một giải pháp thay thế cho mô hình truy vấn Map-Reduce. Tạo báo cáo tổng hợp là một yêu cầu thường xuyên đối với các hệ thống doanh nghiệp và MongoDB đã tỏa sáng trong vấn đề này. Nếu bạn chưa quen với nó, bạn có thể muốn xem phần giới thiệu khung tổng hợp này hoặc phần điều chỉnh hiệu suất và hướng dẫn lập mô hình dữ liệu.
Hãy sử dụng lại mô hình dữ liệu mà tôi đã giới thiệu lần đầu tiên trong khi thể hiện khả năng chèn MongoDB cực nhanh:
{"_id":ObjectId ("5298a5a03b3f4220588fe57c"), "create_on":ISODate ("2012-04-22T01:09:53Z"), "giá trị":0,1647851116706831}
MongoDB 2.6 Cải tiến tổng hợp
Trong phiên bản 2.4, nếu tôi chạy truy vấn tổng hợp sau:
db.randomData.aggregate ([{$ match:{"create_on":{$ gte:new Date (Date.UTC (2012, 0, 1)), $ lte:new Date (Date.UTC (2012, 0, 10))}}}, {$ group:{_id:{"minutes":{$ minutes:"$ create_on"}}, "giá trị":{$ addToSet:"$ value"}}}]);
Tôi đã đạt đến giới hạn kết quả tổng hợp 16MB:
{"errmsg":"exception:kết quả tổng hợp vượt quá kích thước tài liệu tối đa (16MB)", "code":16389, "ok":0}
Tài liệu MongoDB được giới hạn ở 16MB và trước phiên bản 2.6, kết quả tổng hợp là tài liệu BSON. Phiên bản 2.6 đã thay thế nó bằng một con trỏ.
Chạy cùng một truy vấn trên 2.6 thu được kết quả sau:
db.randomData.aggregate ([{$ match:{"create_on":{$ gte:new Date (Date.UTC (2012, 0, 1)), $ lte:new Date (Date.UTC (2012, 0, 10))}}}, {$ group:{_id:{"minutes":{$ minutes:"$ create_on"}}, "giá trị":{$ addToSet:"$ value"}}}]). objsLeftInBatch (); 14
Tôi đã sử dụng phương thức objsLeftInBatch dựa trên con trỏ để kiểm tra loại kết quả tổng hợp và giới hạn 16MB không còn áp dụng cho kết quả tổng thể. Kết quả bên trong con trỏ là tài liệu BSON thông thường, do đó chúng vẫn bị giới hạn ở 16MB, nhưng cách này dễ quản lý hơn so với giới hạn kết quả tổng thể trước đó.
Phiên bản 2.6 cũng giải quyết các hạn chế về bộ nhớ tổng hợp. Quét bộ sưu tập đầy đủ chẳng hạn như:
db.randomData.aggregate ([{$ group:{_id:{"minutes":{$ minutes:"$ created_on"}}, "giá trị":{$ addToSet:"$ value"}}}]) .objsLeftInBatch ();
có thể gặp lỗi sau:
{"errmsg":"exception:Đã vượt quá giới hạn bộ nhớ cho $ group nhưng không cho phép sắp xếp bên ngoài. Chuyển allowDiskUse:true để chọn tham gia.", "code":16945, "ok":0}Vì vậy, bây giờ chúng ta có thể thực hiện các thao tác sắp xếp lớn bằng cách sử dụng tham số allowDiskUse:
db.randomData.aggregate ([{$ group:{_id:{"minutes":{$ minutes:"$ create_on"}}, "giá trị":{$ addToSet:"$ value"}}}], {allowDiskUse:true}). objsLeftInBatch ();Phiên bản 2.6 cho phép chúng tôi lưu kết quả tổng hợp vào một tập hợp khác bằng cách sử dụng giai đoạn $ out mới được thêm vào.
db.randomData.aggregate ([{$ match:{"create_on":{$ gte:new Date (Date.UTC (2012, 0, 1)), $ lte:new Date (Date.UTC (2012, 0, 10))}}}, {$ group:{_id:{"minutes":{$ minutes:"$ create_on"}}, "giá trị":{$ addToSet:"$ value"}}}, {$ out:"randomAggregates"}]); db.randomAggregates.count (); 60Các toán tử mới đã được thêm vào chẳng hạn như let, map, cond, đến tên một số.
Ví dụ tiếp theo sẽ thêm AM hoặc PM vào thông tin thời gian của từng mục sự kiện cụ thể.
var dataSet =db.randomData.aggregate ([{$ match:{"create_on":{$ gte:new Date (Date.UTC (2012, 0, 1)), $ lte:new Date (Date.UTC (2012, 0, 2))}}}, {$ project:{"clock":{$ let:{vars:{"hour":{$ substr:["$ create_on", 11, -1]}, "am_pm":{$ cond:{if:{$ lt:[{$ hour:"$ created_on"}, 12]}, then:'AM', else:'PM'}}}, trong:{$ concat :["$$ hours", "", "$$ am_pm"]}}}}}, {$ limit:10}]); dataSet.forEach (function (document) {printjson (document);});Dẫn đến:
"clock":"16:07:14 PM" "clock":"22:14:42 PM" "clock":"21:46:12 PM" "clock":"03:35:00 AM "" đồng hồ ":" 04:14:20 sáng "" đồng hồ ":" 03:41:39 sáng "" đồng hồ ":" 17:08:35 CH "" đồng hồ ":" 18:44:02 CH "" đồng hồ ":" 19:36:07 CH "" đồng hồ ":" 07:37:55 sáng "Kết luận
Phiên bản MongoDB 2.6 đi kèm với rất nhiều cải tiến khác như thao tác hàng loạt hoặc giao điểm chỉ mục. MongoDB không ngừng phát triển, cung cấp một giải pháp thay thế khả thi cho việc lưu trữ dựa trên tài liệu. Với tốc độ phát triển như vậy, không có gì ngạc nhiên khi nó được vinh danh là cơ sở dữ liệu của năm 2013.