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

Nhóm các tài liệu theo cặp bằng cách sử dụng tính năng tổng hợp mongo

Đây là điều không thể thực hiện được với khung tổng hợp và phương thức MongoDB hiện tại duy nhất có sẵn cho loại hoạt động này là mapReduce.

Lý do là khung tổng hợp không có cách nào tham chiếu đến bất kỳ tài liệu nào khác trong quy trình hơn tài liệu hiện tại. Điều này thực sự cũng áp dụng cho các giai đoạn của quy trình "nhóm", vì mặc dù mọi thứ được nhóm trên một "khóa", bạn không thể thực sự xử lý các tài liệu riêng lẻ theo cách bạn muốn.

Mặt khác, MapReduce có sẵn một tính năng cho phép bạn làm những gì bạn muốn ở đây và nó thậm chí không liên quan trực tiếp đến việc tổng hợp. Trên thực tế, đó là khả năng có "các biến phạm vi toàn cầu" trên tất cả các giai đoạn. Và có một "biến" để "lưu trữ tài liệu cuối cùng" về cơ bản là tất cả những gì bạn cần để đạt được kết quả của mình.

Vì vậy, nó là mã khá đơn giản và thực tế là không cần "giảm":

db.collection.mapReduce(
    function () {
      if (lastVal != null)
        emit( this._id, this.val - lastVal );
      lastVal = this.val;
    },
    function() {}, // mapper is not called
    {
        "scope": { "lastVal": null },
        "out": { "inline": 1 }
    }
)

Điều này mang lại cho bạn một kết quả giống như thế này:

{
    "results" : [
            {
                    "_id" : ObjectId("54a425a99b8bcd6f73e2d662"),
                    "value" : 2
            },
            {
                    "_id" : ObjectId("54a425a99b8bcd6f73e2d663"),
                    "value" : 3
            },
            {
                    "_id" : ObjectId("54a425a99b8bcd6f73e2d664"),
                    "value" : 4
            }
    ],
    "timeMillis" : 3,
    "counts" : {
            "input" : 4,
            "emit" : 3,
            "reduce" : 0,
            "output" : 3
    },
    "ok" : 1
}

Đó thực sự chỉ là chọn "thứ gì đó độc đáo" dưới dạng _id được phát ra giá trị hơn là bất cứ điều gì cụ thể, bởi vì tất cả những gì điều này thực sự đang làm là sự khác biệt giữa các giá trị trên các tài liệu khác nhau.

Các biến toàn cục thường là giải pháp cho các kiểu tổng hợp "ghép nối" này hoặc tạo ra "các tổng đang chạy". Ngay bây giờ, khung tổng hợp không có quyền truy cập vào các biến toàn cục, mặc dù nó có thể là một điều tuyệt vời khi có. Khung mapReduce có chúng, vì vậy có lẽ công bằng khi nói rằng chúng cũng nên có sẵn cho khung tổng hợp.

Ngay bây giờ họ không mặc dù vậy, vì vậy hãy gắn bó với mapReduce.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. không thể bắt đầu mongo db, ngoại lệ initandlisten

  2. Thêm một số loại số hàng vào lệnh / đường ống tổng hợp mongodb

  3. MONGO chỉ lấy tên của tài liệu mà không nhận được toàn bộ tài liệu

  4. Cập nhật bản ghi bằng mongoose

  5. MongoDB:Lợi ích của việc sử dụng MapReduce mà không có song song là gì?