MongoDB / PHP / MapReduce / Reg Exp / Strings-> Floats - PullRequest
0 голосов
/ 02 ноября 2018

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

1 Ответ

0 голосов
/ 02 ноября 2018

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

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...