我在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
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"]]
答案 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);
如果数据类型不匹配,则需要进行类型转换。