在Mongo中映射Reduce,将mongo查询转换为php mongo

时间:2013-08-10 14:45:49

标签: php mongodb mapreduce

我在mongo中有一个看起来像是

的查询
db.Table_Name.group({
   "key": { "Camp": true },
   "initial": { "Clicks": 0 },
   "reduce": function(obj, prev) {
       prev.Clicks = prev.Clicks + obj.Clicks-0;
   },
   "cond": { "Date": { $gte: "2012-10-26", $lte: "2012-10-28" } }
});

我想在php中使用此代码。我尝试了所有可能的方法。任何人都可以帮助我摆脱这个问题。即使我遵循这个http://php.net/manual/en/mongodb.command.php请任何人帮助我。

我试过这个

$reduce = new MongoCode(
    "function(obj, prev) {prev.Clicks = prev.Clicks + obj.Clicks-0;}"
);

$result = $db_1->command(array(
    'mapreduce' => 'Collection_Name',
    'key'       => array("Camp" => true),   
    'initial'  => array('Clicks' => 0), 
    'reduce' => $reduce,                
    'cond' => array(
        'Date' => array('$gte' => '2010-07-12' , '$lte' => '2013-07-12')
     ), 
));

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用MongoCollection::group?对于您的示例,它可能看起来像这样(未经测试)。

$keys = array("Camp" => 1);
$initial = array("Clicks" => 0);
$reduce = "function(obj, prev) {prev.Clicks = prev.Clicks + obj.Clicks-0;}";
$condition = array(
    'Date' => array('$gte' => '2010-07-12', '$lte' => '2013-07-12')
);
$result = $collection->group($keys, $initial, $reduce, $condition);

此外,您应该尝试使用MongoDB术语,我知道这只是一个示例,但Table_Name应该Collection_NameMongoDb does not have tables

答案 1 :(得分:0)

您可以在此处使用group命令,但它是:

  • 基本上是Map Reduce
  • 的JavaScript
  • 通常不使用分片(有些人已经制作)
  • 不赞成使用聚合框架

相反,更好的选择是使用聚合框架:

$mongo->db->collection->aggregate(array(
    array('$match'=>array('date'=>array('$gte' => '2010-07-12','$lte' => '2013-07-12'))),
    array('$group'=>array('_id'=>'$Camp', 'sum_clicks'=>array('$sum'=>'$Clicks')))
));
相关问题