Я б запропонував використовувати карту / зменшити, коли ви використовуєте функцію карти, щоб випромінювати лише тоді, коли випадкове значення вище заданої ймовірності.
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);
Вище функція reduf працює, тому що лише одна клавіша ("1") випускається з функції карти.
Значення "ймовірності" визначається у "області" при виклику mapRreduce (...)
Використовуючи mapReduce, подібний до цього, слід також використовуватись на шаруватий db.
Якщо ви хочете вибрати з nb рівно n м документів, ви можете зробити це так:
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);
Де "countTotal" (m) - кількість документів у db, а "countSubset" (n) - кількість документів, які потрібно отримати.
Такий підхід може спричинити певні проблеми у шаруватих базах даних.