Map Reduce在Mongo中的应用,将Mongo查询转换为PHP Mongo。

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')
     ), 
));
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没有表格

表格;集合...对于最终用户来说,区别并不大,如果他习惯称之为表格,那么我并不认为有什么问题。 - Sammaye
2
嗨Sammaye,是的,你说得对,没有真正的“问题”...然而,在长期使用错误术语的情况下,只会导致你的大脑混乱。更不用说如果你在会议上使用了错误的术语,或者更糟糕的是在面试中使用了错误的术语,那么你看起来会很糟糕。 - Robbie
谢谢您的帮助,您能告诉我如何按日期排序吗? - Sreenath

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')))
));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接