聚合查询未在laravel中显示输出

时间:2017-11-08 15:21:29

标签: php mongodb laravel aggregation-framework

我在MongoDB数据库中跟踪收集

clat_output

{
"_id" : ObjectId("59fc6492421aa91e3e71d753"),
"output" : [ 
    {
        "time" : "100",
        "clat" : "127"
    }, 
    {
        "time" : "254",
        "clat" : "294"
    }, 
    {
        "time" : "354",
        "clat" : "437"
    }
    ...
    ...
]
}

我想检索 clat_output ,条件是 clat_output 中的时间应该在给定范围之间。

例如

我想以_id = ObjectId("59fc6492421aa91e3e71d753")1

的时间间隔获取{{>> clat_output 300 { "_id" : ObjectId("59fc6492421aa91e3e71d753"), "output" : [ { "time" : "100", "clat" : "127" }, { "time" : "254", "clat" : "294" } ] }

所以它应该给出以下输出

db.clat_output.aggregate({
  '$match' : {"_id" : ObjectId("59fc6492421aa91e3e71d753")}}, {
    '$addFields' : {
      'output' : {
        '$filter' : {
            'input' : '$output',
            'as' : 'result',
            'cond' : { 
                '$and' : [
                  {'$gte' : ['$$result.time', '1']},
                  {'$lte' : ['$$result.time', '300']}
                ]
            }
        }
    }
  }
});

当我在mongodb控制台中运行以下查询时,它会给我想要的结果。

output

但是当我在laravel中将相同的聚合查询转换为原始查询时,它将public function clat_output($id, $start, $end) { $query = [ ['$match' => ["_id" => $id]], [ '$addFields' => [ 'output' => [ '$filter' => ['input' => '$output', 'as' => 'result', 'cond' => [ '$and' => [ ['$gte' => ['$$result.time', $start]], ['$lte' => ['$$result.time', $end]] ] ] ] ] ] ] ]; $result = self::raw(function ($collection) { return $collection->aggregate($query); }); return $result; } 显示为空数组。以下是我在laravel中的查询

uri.headers
#=> [[], ["subject", "test"], ["body", "type%20your"], ["body", "message%20here"]]

1 个答案:

答案 0 :(得分:1)

看来你的查询很完美。我唯一怀疑的是关于$start$end的类型不匹配。要验证您可以在mongo控制台中使用以下代码。

function printSchema(obj) { 
  for(var key in obj) { 
    if(key === 'output') { 
       print('time',typeof obj[key][0]['time']); 
       break; 
    } 
  } 
}
var obj = db.clat_output.findOne();
printSchema(obj);

在php中使用以下命令检查$start$end的数据类型

echo gettype($start),"\n";
echo gettype($end);

如果数据类型不匹配,则需要进行类型转换。