Я новичок в MapReduce, но у меня есть коллекция, к которой я бы хотел обратиться, чтобы узнать, как работает mapreduce.
Примеры документов:
{ "filename" : "resume.doc",
"folder" : "work",
"completed": "0.5" },
{ "filename" : "spreadsheet.xls",
"folder" : "work",
"completed": "0.6" },
{ "filename" : "thesis.doc",
"folder" : "school",
"completed": "0.75" },
{ "filename" : "coverletter.doc",
"folder" : "work",
"completed": "0.6"}
Итак, вся идея такова: я хотел бы запросить:
{ "folder" : "work",
"completed": { $gt: 0.5 },
"filename" : new MongoRegex( "/\.[a-zA-Z]{2,}$/" ) }
И в конечном итоге получить количество всех документов по расширению (.doc, .xls и т. Д.), Например:
{ ".doc" : 1,
".xls" : 1 }
Я также понимаю, что у меня есть проблема, потому что мои% -completed являются строками, а не числами с плавающей точкой, поэтому я думаю, что mongodb понадобится больше инструкций для сравнения строк.
Я использую (если это имеет значение):
PHP extension: mongo/1.5.7
MongoDB: version 3.2.11
Кажется, я наткнулся на свой собственный ответ.
Дайте мне знать, если кто-нибудь придумает более краткое / экспертное решение.
Но это похоже на работу.
try {
$map = new MongoCode(
'function(){
var re = new RegExp(/(.+)\.([a-zA-Z]{2,})$/);
doctype = this.value.match(re);
if(parseFloat(this.completed)>0.5){
emit(doctype[2], parseFloat(this.completed));
}
}'
);
$reduce = new MongoCode(
'function(key, values){
var sum = 0, num = 0;
for(var i in values){
if(parseFloat(values[i])>0.5){
sum += values[i];
num += 1;
}
}
return { number_of_documents : num,
sum_of_document_completions : sum,
average_completion : (sum/num) };
}'
);
$query = array (
"folder" => "work");
$doctypes = $db->command(
array(
'mapReduce' => 'mydocuments',
"map" => $map,
"reduce" => $reduce,
"query" => $query,
"out" => array("inline"=>1)
)
);
print_r ( $doctypes);
}
catch(MongoCursorException $e) {
echo "error message: ".$e->getMessage()."\n";
echo "error code: ".$e->getCode()."\n";
}
Других решений пока нет …