Laravel MongoDB获取文档数组长度问题:原生查询正常,框架返回Cursor
解决方案:处理jenssegers/laravel-mongodb聚合返回的Cursor对象
我明白你的问题——原生MongoDB聚合能直接拿到数组长度,但用jenssegers包的raw聚合返回的是MongoDB\Driver\Cursor对象,没法直接读取结果对吧?这是因为MongoDB的聚合操作本身返回的是游标,这个包直接返回了原生的游标实例,我们只需要做一步转换就能拿到想要的数值。
下面给你两种可行的解决方法:
方法1:转换游标为数组并提取结果
直接调用游标对象的toArray()方法,把它转换成PHP数组,然后取出第一个文档里的count值:
$query = DB::connection($this->mongoCon)->collection($this->table)->raw(function($collection) use ($vehicleComponentId) { return $collection->aggregate([ ['$match' => ['vehicle_component_id' => $vehicleComponentId]], ['$project' => ['count' => ['$size' => '$mileages']]], ]); }); // 将游标转为数组,获取第一个结果的count值(加空值判断避免无匹配时报错) $resultArray = $query->toArray(); $mileageLength = $resultArray[0]['count'] ?? 0;
方法2:使用Laravel风格的聚合写法
其实不用raw()方法,jenssegers/laravel-mongodb已经封装了更贴合Laravel的聚合语法,这样代码更简洁:
$mileageLength = DB::connection($this->mongoCon)->collection($this->table) ->where('vehicle_component_id', $vehicleComponentId) ->aggregate([ ['$project' => ['count' => ['$size' => '$mileages']]] ]) ->first()['count'] ?? 0;
补充说明
MongoDB\Driver\Cursor是PHP MongoDB扩展返回的原生游标对象,它代表了查询结果的集合,需要通过toArray()或first()等方法来获取具体数据。- 加上
?? 0是为了防止当没有匹配到vehicle_component_id=3的文档时,不会因为访问不存在的数组键而抛出错误。
内容的提问来源于stack exchange,提问作者Fadi
相关产品推荐
相关产品推荐

