Php 聚合查询未在laravel中显示输出
我的MongoDB数据库中有以下集合 clat\u输出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",
{
"_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中的整数进行比较。