3

我在 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')
     ), 
));
4

2 回答 2

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_Name因为MongoDb 没有表

于 2013-08-10T19:42:40.010 回答
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')))
));
于 2013-08-10T19:55:49.980 回答