2016-09-26 12 views
0

私はこれは私がPHPのコードにこの行を変換するために、問題PHPでmongoDBのクエリを変換するには?

query: { date: { $gt: ISODate('2016-09-20') } }, 

これを直面しています私のMongoDBのクエリ

db.contact_facts.mapReduce(
     function() { 
      var k = new Date(this.date); 
    k.setHours(0); 
      k.setMinutes(0); 
      k.setSeconds(0); 
      k.setMilliseconds(0); 
      emit({idM:this.idMailing, 
     fact:this.fact, 
     year:k.getFullYear(), 
     month:k.getMonth(), 
     day:k.getDate() 
    }, 1); 
     }, 
     function (key, values) { 
      return Array.sum(values); 
     }, 
     { 
    query: { date: { $gt: ISODate('2016-09-20') } }, 
    out: { reduce: "contact_fact_stats2"}, 
     } 
); 

あるPHP

にMongoDBのクエリを変換する問題に直面しています私はPHPで書いたものです

$dm = $this->getContainer()->get('doctrine_mongodb')->getManager(); 
$qb = $dm->createQueryBuilder('AtayenMainBundle:ContactFact'); 
$qb->field('date')->equals("ISODate('2016-09-20T08:42:30.000Z')"); 
$qb->map('function() { 
     var k = new Date(this.date); 
     k.setHours(0); 
      k.setMinutes(0); 
      k.setSeconds(0); 
      k.setMilliseconds(0); 
     emit({idM:this.idMailing,fact:this.fact,date:this.date}, 1)}'); 

$qb->reduce('function(key, values) { 
     return Array.sum(values); 

    }'); 

$cursor = $qb->getQuery()->execute(); 

答えて

0

私は集約フレームワークで同じクエリをより効率的に実行することができます。集約フレームワークのパフォーマンスは、MongoDBのC++コードの「内部」で実行されるため、バンドルされたJSコンソール内のV8/spidermonkey(バージョンに応じて)環境内で実行されるmapReduceより効率的です。

は、所望の結果を得るために、次のパイプラインの実行を検討:

$connection = $this->getContainer()->get('doctrine_mongodb')->getConnection(); 
$mongo = $connection->getMongo(); 
if (!$mongo) { 
    $connection->connect(); 
    $mongo = $connection->getMongo(); 
} 
$db = $mongo->selectDB('test_database'); 

// construct pipeline 
$pipeline = array( 
    array("$match" => array("date" => array("$gt" => new MongoDate(strtotime("2016-09-20"))))), 
    array( 
     "$project" => array(
      "formattedDate" => array( 
       "$dateToString" => array("format" => "%Y-%m-%d", "date"=> "$date") 
      ), 
      "fact" => 1, 
      "idMailing" => 1 
     ) 
    ), 
    array(
     "$group" => array(
      "_id" => array(
       "fact" => "$fact", 
       "idM" => "$idMailing", 
       "formattedDate" => "$formattedDate" 
      ), 
      "count" => array("$sum" => 1) 
     ) 
    ) 
); 

// run the aggregate command 
$aggregate_results = $db ->command(array( 
    "aggregate" => "contact_facts", 
    "pipeline" => $pipeline 
)); 

のか作成します。あなたは次のようにコマンド機能を使用してパイプライン動作を実行することができます教義のモンゴのODMで

var pipeline = [ 
    { "$match": { "date": { "$gt": new Date("2016-09-20") } } }, 
    { 
     "$project": { 
      "fact": 1, 
      "idMailing": 1, 
      "formattedDate": { 
       "$dateToString": { "format": "%Y-%m-%d", "date": "$date" } 
      } 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "fact": "$fact", 
       "idM": "$idMailing", 
       "formattedDate": "$formattedDate" 
      }, 
      "count": { "$sum": 1 } 
     } 
    } 
] 
db.contact_facts.aggregate(pipeline); 

集計クエリ:

$expr = new \Solution\MongoAggregation\Pipeline\Operators\Expr; 
$aq = $this->get('doctrine_mongodb.odm.default_aggregation_query') 
     ->getCollection('AtayenMainBundle:ContactFact')->createAggregateQuery() 
     ->group(['_id' => [ 
      'year' => $expr->year('$date'), 
      'month' => $expr->month('$date'), 
      'day' => $expr->day('$date'), 
      'fact' => '$fact', 
      'idMailing' => '$idMailing' 
     ], 'count' => $expr->sum(1)]); 

MapReduceの操作で、あなたのようにコマンドを実行することができます。

$connection = $this->getContainer()->get('doctrine_mongodb')->getConnection(); 
$mongo = $connection->getMongo(); 
if (!$mongo) { 
    $connection->connect(); 
    $mongo = $connection->getMongo(); 
} 
$db = $mongo->selectDB('test_database'); 


// construct map and reduce functions 
$map = new MongoCode("function() { 
     var k = new Date(this.date); 
     k.setHours(0); 
     k.setMinutes(0); 
     k.setSeconds(0); 
     k.setMilliseconds(0); 

     var obj = { 
      idM: this.idMailing, 
      fact: this.fact, 
      year: k.getFullYear(), 
      month: k.getMonth(), 
      day: k.getDate() 
     }; 
     emit(obj, 1); 
    }"); 

$reduce = new MongoCode("function (key, values) { 
    return Array.sum(values); 
    }"); 

$mr = $db->command(array(
    "mapreduce" => "contact_facts", 
    "map" => $map, 
    "reduce" => $reduce, 
    "query" => array("date" => array("$gt" => new MongoDate(strtotime("2016-09-20")))), 
    "out" => array("merge" => "eventCounts"))); 

$results = $db->selectCollection($mr['result'])->find(); 

foreach ($results as $res) { 
    echo "{$res['_id']} had {$res['value']} counts.\n"; 
} 
+0

クラスが見つからない例外MongoDateは、私はクラスが見つからない例外を解決するために何をすべき –

+0

@chirdamを見つけていませんか? –

+0

@IbrahimMAATKIどのPHPバージョンをお使いですか?その側面に応じて、この質問の回答は役立ちますhttp://stackoverflow.com/questions/34667609/ – chridam

関連する問題