Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Truy vấn MongoDB hiển thị document cách nhau (alternating) với mapReduce

Sử dụng mapReduce() với biến đếm để phát ra (emit) chỉ các document ở vị trí lẻ (hoặc chẵn) - tương tự lấy document cách nhau.

Tạo collection 6 document

> db.demo636.insert({id:1});
> db.demo636.insert({id:2});
> db.demo636.insert({id:3});
> db.demo636.insert({id:4});
> db.demo636.insert({id:5});
> db.demo636.insert({id:6});

Hiển thị tất cả

> db.demo636.find();

Kết quả: id 1,2,3,4,5,6

MapReduce chỉ lấy vị trí lẻ (odd: 1,3,5)

> db.demo636.mapReduce(
  function() {
    oddCounter++;
    var id = this._id;
    delete this._id;
    if (oddCounter % d != 0)
      emit(id, this);
  },
  function() {},
  {
    "scope": { "oddCounter": 0, "d": 2 },
    "out": { "inline": 1 }
  }
)

Kết quả (chỉ id 1, 3, 5 - vị trí lẻ):

{
  "results": [
    { "_id": ObjectId("5e9c127b6c954c74be91e6d2"), "value": { "id": 1 } },
    { "_id": ObjectId("5e9c127f6c954c74be91e6d4"), "value": { "id": 3 } },
    { "_id": ObjectId("5e9c12836c954c74be91e6d6"), "value": { "id": 5 } }
  ],
  "timeMillis": 29,
  "counts": { "input": 6, "emit": 3, "reduce": 0, "output": 3 },
  "ok": 1
}

Giải thích:

  • oddCounter: Biến đếm thứ tự document (scope khởi tạo = 0)
  • d: 2: Chia cho 2 để xác định chẵn/lẻ
  • oddCounter % d != 0: Phát ra khi KHÔNG chia hết cho 2 → vị trí lẻ (1,3,5...)
  • Để lấy vị trí chẵn (2,4,6): đổi điều kiện thành oddCounter % d == 0

Lưu ý: MapReduce phức tạp và chậm hơn aggregate. Để lấy document cách nhau đơn giản, dùng skip() + limit() hoặc $facet (MongoDB 3.4+). MapReduce phù hợp xử lý phức tạp, tính toán tùy chỉnh.