代码之家  ›  专栏  ›  技术社区  ›  Ben Coffin

MongoDB/PHP/MapReduce/Reg Exp/Strings->Floats

  •  0
  • Ben Coffin  · 技术社区  · 7 年前

    我是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" : 1,
      ".xls" : 1 }
    

    我还意识到我遇到了一个问题,因为我的代码是字符串,而不是浮点数,所以我认为mongodb需要更多的指令来比较字符串。

    我正在使用(如果重要的话):

    PHP extension: mongo/1.5.7
    MongoDB: version 3.2.11
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Ben Coffin    7 年前

    似乎我偶然发现了自己的答案。 如果有人提出更简洁/专业的解决方案,请告诉我。

    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";
    }
    
    推荐文章