Saya akan menyarankan menggunakan peta / mengurangi, di mana Anda menggunakan fungsi peta hanya memancarkan ketika nilai acak di atas probabilitas yang diberikan.
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);
Fungsi pengurangan di atas berfungsi karena hanya satu kunci ('1') yang dipancarkan dari fungsi peta.
Nilai "probabilitas" didefinisikan dalam "lingkup", ketika memohon mapRreduce (...)
Menggunakan mapReduce seperti ini juga bisa digunakan pada db yang di-shard.
Jika Anda ingin memilih dengan tepat dari dokumen dari db, Anda dapat melakukannya seperti ini:
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);
Di mana "countTotal" (m) adalah jumlah dokumen dalam db, dan "countSubset" (n) adalah jumlah dokumen yang akan diambil.
Pendekatan ini mungkin memberikan beberapa masalah pada basis data sharded.