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

Tìm số bản ghi liên tiếp tối đa dựa trên một trường trong Mongodb Query

Bạn có thể thực hiện thao tác mapReduce này.

Đầu tiên người lập bản đồ:

var mapper = function () {


    if ( this.flag == true ) {
        totalCount++;
    } else {
        totalCount = 0;
    }

    if ( totalCount != 0 ) {
        emit (
        counter,
        {  _id: this._id, totalCount: totalCount }
    );
    } else {
      counter++;
    }

};

Điều này giữ số lượng đang chạy trong tổng số lần true giá trị được nhìn thấy trong cờ. Nếu số lượng đó nhiều hơn 1 thì chúng tôi phát ra giá trị, cũng chứa tài liệu _id . Một bộ đếm khác được sử dụng cho khóa được tăng lên khi cờ false , để có "khóa" nhóm cho các trận đấu.

Sau đó, bộ giảm tốc:

var reducer = function ( key, values ) {

    var result = { docs: [] };

    values.forEach(function(value) {
        result.docs.push(value._id);
        result.totalCount = value.totalCount;
    });

    return result;

};

Chỉ cần đẩy _id các giá trị vào một mảng kết quả cùng với Tổng số.

Sau đó chạy:

db.people.mapReduce(
    mapper,
    reducer,
   { 
       "out": { "inline": 1 }, 
       "scope": { 
           "totalCount": 0, 
           "counter": 0 
       }, 
       "sort": { "updated_at": 1 } 
   }
)

Vì vậy, với mapperreducer các hàm, sau đó chúng tôi xác định các biến toàn cục được sử dụng trong "phạm vi" và chuyển vào "sắp xếp" được yêu cầu trên updated_at ngày. Kết quả là:

{
    "results" : [
        {
            "_id" : 1,
            "value" : {
                "docs" : [
                     3,
                     4
                 ],
                 "totalCount" : 2
            }
        },
        {
            "_id" : 2,
            "value" : {
            "docs" : [
                7,
                8,
                5
             ],
             "totalCount" : 3
             }
        }
    ],
    "timeMillis" : 2,
    "counts" : {
            "input" : 7,
            "emit" : 5,
            "reduce" : 2,
            "output" : 2
    },
    "ok" : 1,
}

Tất nhiên, bạn chỉ có thể bỏ qua totalCount và chỉ sử dụng độ dài mảng, sẽ giống nhau. Nhưng vì bạn vẫn muốn sử dụng bộ đếm đó, nó chỉ được thêm vào. Nhưng đó là nguyên tắc.

Vì vậy, có, đây là một vấn đề phù hợp với mapReduce và bây giờ bạn có một ví dụ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách giải quyết TypeError:loại 'danh sách' không thể nhấn mạnh

  2. PyMongo Cập nhật tài liệu với nhiều bản ghi

  3. MongoDB watch () để quan sát sự thay đổi trong Cơ sở dữ liệu với NodeJS và Mongoose

  4. Hiệu suất tìm kiếm trong MongoDb

  5. Phân trang theo phạm vi khi truy vấn và sắp xếp trên các trường động, không phải duy nhất trong mongodb