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

Php 聚合查询未在laravel中显示输出,php,mongodb,laravel,aggregation-framework,Php,Mongodb,Laravel,Aggregation Framework,我的MongoDB数据库中有以下集合 clat\u输出 { "_id" : ObjectId("59fc6492421aa91e3e71d753"), "output" : [ { "time" : "100", "clat" : "127" }, { "time" : "254", "clat" : "294" }, { "time" : "354",

我的MongoDB数据库中有以下集合

clat\u输出

{
"_id" : ObjectId("59fc6492421aa91e3e71d753"),
"output" : [ 
    {
        "time" : "100",
        "clat" : "127"
    }, 
    {
        "time" : "254",
        "clat" : "294"
    }, 
    {
        "time" : "354",
        "clat" : "437"
    }
    ...
    ...
]
}
我想检索clat_输出,条件是clat_输出中的时间应该在给定范围内

比如说

我想获取clat\u输出具有
\u id=ObjectId(“59fc6492421aa91e3e71d753”)
,给定时间间隔为
1
300

所以它应该给出以下输出

{
"_id" : ObjectId("59fc6492421aa91e3e71d753"),
"output" : [ 
    {
        "time" : "100",
        "clat" : "127"
    }, 
    {
        "time" : "254",
        "clat" : "294"
    }
]
}
当我在mongodb控制台中运行以下查询时,它会给我期望的结果

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']}
                ]
            }
        }
    }
  }
});
但当我在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;
}

看来你的问题很完美。我唯一有点怀疑的是
$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);

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

虽然可能没有直接关系,但数据存在缺陷。您将
'time'
作为一个“字符串”,因此像
'5'
这样的值不在
'1'
'300'
的值之间,因为它以
'5'
开头,并且作为一个不在范围内的“字符串”。如果要查询“数值范围”,实际上需要“数值”值。所以你真的应该转换数据。是的,有一个类型不匹配。时间字段作为字符串存储在数据库中,我将其与php中的整数进行比较。