Yalnızca rastgele bir değer belirli bir olasılığın üzerinde olduğunda harita işlevini kullandığınız harita / azaltma kullanmanızı öneririm.
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);
Harita işlevinden yalnızca bir anahtar ('1') yayıldığı için yukarıdaki reducef işlevi çalışır.
"Olasılık" değeri, mapRreduce (...) çağrılırken "kapsamda" tanımlanır.
Bunun gibi mapReduce kullanılması, parçalanmış bir db'de de kullanılabilir olmalıdır.
Eğer db'den tam olarak m belge seçmek istiyorsanız, bunu şu şekilde yapabilirsiniz:
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);
Burada "countTotal" (m) db'deki belge sayısı ve "countSubset" (n) alınacak belge sayısıdır.
Bu yaklaşım, parçalanmış veritabanlarında bazı sorunlar verebilir.