MongoDB / PHP / MapReduce / Reg Exp / Strings- & gt; Floats

Я новичок в 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

0

Решение

Кажется, я наткнулся на свой собственный ответ.
Дайте мне знать, если кто-нибудь придумает более краткое / экспертное решение.
Но это похоже на работу.

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";
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]