MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB 2.6 Cải tiến khung tổng hợp

Đây là một bài đăng của Vlad Mihalcea. Vlad là một kiến ​​trúc sư phần mềm đam mê tích hợp phần mềm, khả năng mở rộng cao và những thách thức đồng thời. Đây là liên kết đến bài đăng gốc.

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 (); 60 

Cá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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nhóm mảng sau khi thư giãn và khớp

  2. MongoDB shell và máy chủ không khớp

  3. Bản sửa lỗi Mongodb KB2731284

  4. Đẩy các mục vào mảng mongo thông qua mongoose

  5. MongoDB:Cập nhật tài liệu bằng cách sử dụng dữ liệu từ cùng một tài liệu