Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 将mongo map reduce代码转换为php_Mongodb_Mapreduce - Fatal编程技术网

Mongodb 将mongo map reduce代码转换为php

Mongodb 将mongo map reduce代码转换为php,mongodb,mapreduce,Mongodb,Mapreduce,我有下面的mongoshell代码,我正试图在我的php应用程序中使用它。 它基本上是在一个时间范围内取800个均匀分布的值,用于图形中 var map = function () { if (endTime < 0) { var start = new ISODate("2013-09-01T00:00:00.000Z"); var end = new ISODate("2013-11-01T00:00:00.000Z"); var startMilli = st

我有下面的mongoshell代码,我正试图在我的php应用程序中使用它。 它基本上是在一个时间范围内取800个均匀分布的值,用于图形中

var map = function () {
if (endTime < 0) {
    var start = new ISODate("2013-09-01T00:00:00.000Z");
    var end = new ISODate("2013-11-01T00:00:00.000Z");
    var startMilli = start.getTime(); 
    var endMilli = end.getTime(); 
    var interval = endMilli - startMilli; 
    delta = interval / 800;
    endTime = startMilli + delta;
    }
if (endTime < this.date.getTime()) { 
    resArray = {};
    while (endTime < this.date.getTime()) {
        endTime += delta; 
    }
}
    var id = this.homeId + this.sensor;
if (typeof resArray[id] == 'undefined') {
resArray[id] = 1;
emit({ 
    homeId: this.homeId, 
    sensor: this.sensor, 
    date: this.date, 
    val: this.val
}, { 
    x: 1 
});
}
};
var reduce = function (key, values) { 
return values[0];
};


db.passiv.mapReduce(
map, 
reduce, 
{ query: 
    { homeId: 35600, 
      sensor : { 
        $in :[ "z1t","ts1"] 
    }, 
    date : { 
        $gte : new ISODate("2013-09-01T00:00:00.000Z"), 
        $lte : new ISODate("2013-11-01T00:00:00.000Z")
    } }, 
    scope : { 
        resArray : {}, 
        delta : -1, 
        endTime : -1 
    }, 
    out: 'TEST1', 
    sort : { 
        date:1 
    } 
});
var map=函数(){
如果(结束时间<0){
var开始=新的ISO日期(“2013-09-01T00:00:00.000Z”);
var end=新的等值日期(“2013-11-01T00:00:00.000Z”);
var startMilli=start.getTime();
var endMilli=end.getTime();
var区间=endMilli-startMilli;
δ=间隔/800;
endTime=起始百万+增量;
}
如果(endTime
它在shell中执行得很好,但我尝试将其转换为php时没有得到任何结果:

$from = '2013-09-01T00:00:00.000Z';
$to = '2013-11-01T00:00:00.000Z';

$map = new MongoCode("
var map = function () {
if (endTime < 0) {
var start = new ISODate(".$from.");
var end = new ISODate(".$to.");
var startMilli = start.getTime();
var endMilli = end.getTime();
var interval = endMilli - startMilli;
delta = interval / 800;
endTime = startMilli + delta;
}
if (endTime < this.date.getTime()) {
resArray = {};
while (endTime < this.date.getTime()) {
    endTime += delta;
}
}
var id = this.homeId + this.sensor;
if (typeof resArray[id] == 'undefined') {
resArray[id] = 1;
emit({
    homeId: this.homeId,
    sensor: this.sensor,
    date: this.date,
    val: this.val},
    { x: 1 });
}
};");

$reduce = new MongoCode('
var reduce = function (key, values) {
    return values[0];
};');

$constraint = array('homeId' => 32168);
$date = array('$gte' => new MongoDate(1377986400), '$lt' => new MongoDate(1383260400));
$condition = array_merge($constraint, $date, array("sensor" => array('$in' => array('z1t', 'ts1'))));
$rs = $passivCollection->command(
array(
    "mapreduce" => "passiv",
    "query" => $condition,
    "map" => $map,
    "reduce" => $reduce,
    "scope" => array(
        "resArray" => array(),
        "delta" => -1,
        "endTime" => -1
    ),
    "out" => "TEST1",
    "sort" => array("date" => 1)
));
$from='2013-09-01T00:00:00.000Z';
$to='2013-11-01T00:00:00.000Z';
$map=新的MongoCode(“
变量映射=函数(){
如果(结束时间<0){
var start=新的ISODate(“.$from”);
var end=新的ISODate(“.$to.”);
var startMilli=start.getTime();
var endMilli=end.getTime();
var区间=endMilli-startMilli;
δ=间隔/800;
endTime=起始百万+增量;
}
if(endTime32168);
$date=数组('$gte'=>新MongoDate(1377986400),'$lt'=>新MongoDate(1383260400));
$condition=array\u merge($constraint,$date,array(“传感器”=>array('$in'=>array('z1t','ts1'))));
$rs=$S收集->命令(
排列(
“mapreduce”=>“被动”,
“查询”=>$condition,
“map”=>$map,
“reduce”=>reduce美元,
“范围”=>数组(
“重新排列”=>array(),
“增量”=>-1,
“结束时间”=>-1
),
“out”=>“TEST1”,
“排序”=>数组(“日期”=>1)
));

不知何故,我认为是命令末尾的作用域不能正常工作,我似乎在任何地方都找不到任何关于作用域方面的有用信息。非常感谢您的帮助。

这里有一个在PHP中使用Map Reduce的好例子:示例3

基本上,您遇到的问题之一是,
MongoCode
对象不再表示非函数,而是一个无法返回的变量

相反,您希望定义如下函数:

$reduce = new MongoCode('
function (key, values) {
    return values[0];
};
');
我想这会解决的

编辑 您的PHP在编辑过程中出现问题:

$start = new MongoDate(strtotime("2013-09-01 00:00:00"));
$end = new MongoDate(strtotime("2013-11-01 00:00:00"));
$constraint = array('homeId' => '32168');
$date = array('$gte' => $start, '$lt' => $end);
$sensors = array('z1t');
$condition = array_merge($constraint, $date, array("sensor" => array('$in' => $sensors)));
var_dump($condition);
$tt = $passivCollection->selectCollection('passiv')->count($date);
var_dump($tt);
您正在使用:

$date = array('$gte' => $start, '$lt' => $end);
在不定义字段的情况下,它应该进行搜索。尝试:

$start = new MongoDate(strtotime("2013-09-01 00:00:00"));
$end = new MongoDate(strtotime("2013-11-01 00:00:00"));
$constraint = array('homeId' => '32168');
$date = array('date' => array('$gte' => $start, '$lt' => $end));
$sensors = array('z1t');
$condition = array_merge($constraint, $date, array("sensor" => array('$in' => $sensors)));
var_dump($condition);
$tt = $passivCollection->selectCollection('passiv')->count($date);
var_dump($tt);
其中,
日期
字符串位于:

$date = array('date' => array('$gte' => $start, '$lt' => $end));

已替换为您的字段名。

谢谢,感谢您的及时回复!我更改了代码,谢天谢地它没有给我任何错误。但是,生成的集合(TEST1)为空。。我是否正确使用范围参数?想知道它还能做什么be@user1682384不,看起来不错,当您正常运行查询时,您是否从find函数中获得了任何文档?当我在shell中执行查询时,它似乎工作得很好(无论处理600M+文档的速度有多慢),但当我通过php执行查询时,似乎什么都不起作用。我希望有个mongodb专家在我身边。。编辑:当我在shell中进行查询时,它似乎工作得很好(无论处理6亿多个文档的速度有多慢),但当我通过php进行查询时,似乎什么都不起作用。我希望有个mongodb专家在我身边
db.passive.find({date:{$gte:new date(2013,8,1),$lt:new date(2013,10,1)},homeId:32168,sensor:'z1t'})。count()
@user1682384您确定您的连接设置正确吗?你能给我看一段完整的代码吗,从查询的开始到结束(连接设置等)?