mongodb - php mongo 使用execute执行mapreduce报错
本文介绍了mongodb - php mongo 使用execute执行mapreduce报错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
$map = "function() {
for (var i = 0; i < this.items.length; i++) {
emit(this.name, this.items[i].$param); } }";
$reduce = "function(name, sum) { return Array.sum(sum); }";
$opt = "{ out: 'totals' }";
$db->execute("db.stores.mapReduce($map, $reduce, $opt);");
报错信息:
Cannot run mapReduce command from eval()
解决方案
execute方法通过eval执行JS代码。eval好像Mongo 3里是deprecated。eval也用个global write lock,最好不用。
你可以用command方法,PHP.net上有个mapReduce例子(http://php.net/manual/en/mong...),下面给你参考:
// construct map and reduce functions
$map = new MongoCode("function() { emit(this.user_id,1); }");
$reduce = new MongoCode("function(k, vals) { ".
"var sum = 0;".
"for (var i in vals) {".
"sum += vals[i];".
"}".
"return sum; }");
$sales = $db->command(array(
"mapreduce" => "events",
"map" => $map,
"reduce" => $reduce,
"query" => array("type" => "sale"),
"out" => array("merge" => "eventCounts")));
但是我建议这样简单的mapreduce可以通过aggregation framework写出来。
这篇关于mongodb - php mongo 使用execute执行mapreduce报错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文