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.