Tôi sẽ đề nghị sử dụng map / less, trong đó bạn sử dụng chức năng bản đồ để chỉ phát ra khi giá trị ngẫu nhiên vượt quá xác suất cho trước.
function mapf() {
if(Math.random() <= probability) {
emit(1, this);
}
}
function reducef(key,values) {
return {"documents": values};
}
res = db.questions.mapReduce(mapf, reducef, {"out": {"inline": 1}, "scope": { "probability": 0.5}});
printjson(res.results);
Hàm lessef ở trên hoạt động vì chỉ có một phím ('1') được phát ra từ chức năng bản đồ.
Giá trị của "xác suất" được xác định trong "phạm vi", khi gọi mapRreduce (...)
Sử dụng mapReduce như thế này cũng có thể sử dụng được trên một db bị phân mảnh.
Nếu bạn muốn chọn chính xác n tài liệu m từ db, bạn có thể làm như thế này:
function mapf() {
if(countSubset == 0) return;
var prob = countSubset / countTotal;
if(Math.random() <= prob) {
emit(1, {"documents": [this]});
countSubset--;
}
countTotal--;
}
function reducef(key,values) {
var newArray = new Array();
for(var i=0; i < values.length; i++) {
newArray = newArray.concat(values[i].documents);
}
return {"documents": newArray};
}
res = db.questions.mapReduce(mapf, reducef, {"out": {"inline": 1}, "scope": {"countTotal": 4, "countSubset": 2}})
printjson(res.results);
Trong đó "CountTotal" (m) là số lượng tài liệu trong db và "CountSubset" (n) là số lượng tài liệu cần truy xuất.
Cách tiếp cận này có thể đưa ra một số vấn đề trên cơ sở dữ liệu bị phân mảnh.