如何解决从aggregate获取PHP array或将MongoDB \ Driver \ Cursor转换为array的正确方法
数据库中的某些文档具有字段“ Assunto”,我想计算“ Assunto”的不同值出现了多少次(忽略该字段何时不存在,因此我执行了以下查询:
$result = $collection->aggregate([
[ '$match' => ['Assunto' => ['$nin' => [null]]] ],[ '$sortByCount'=> '$Assunto' ],[ '$sort' => ['Count' => -1] ]
]);
查询工作正常,我的问题是聚合返回。 From the documentation返回“ MongoDB \ Driver \ Cursor或ArrayIterator对象”。
也来自文档 typeMap :“可选。应用于游标的类型图,它确定BSON文档如何转换为PHP值。默认为集合的类型图”。
我阅读了有关更改集合的typeMap将光标转换为数组的Stack Overflow解决方案,但根据我的理解,我无法让它们工作,根据我的理解,我有多个MongoDB \ Driver \ Cursor,并且它仅返回他们中的第一个。
Stack Overflow的下一个解决方案是将游标编码为JSON,然后将其解码为数组。像这样:
//Convert $result,a MongoDB\Driver\Cursor to array()
$objects = json_decode(json_encode($result->toArray(),true));
问题在于,这会生成一个stdClass对象,如下所示:(对图像模糊不清,调整大小后会发生错误)
因此,要将此stdClass转换为数组,我需要再次执行相同的代码:(抱歉,图像模糊,调整大小后会发生)
//Convert stdClass to Array
$array=json_decode(json_encode($objects),true);
这将产生预期的输出。但是,完成所有这些过程似乎是浪费。在我的情况下,将返回值从aggregate转换为and和array的正确方法是什么?整个代码段以防万一:
$result = $collection->aggregate([
[ '$match' => ['Assunto' => ['$nin' => [null]]] ],[ '$sort' => ['Count' => -1] ]
]);
//Convert $result,multiple MongoDB\Driver\Cursor objects into stdClass Objects
$objects = json_decode(json_encode($result->toArray(),true));
//Convert stdClass Objects into Array()
$array=json_decode(json_encode($objects),true);
return $array;
解决方法
那是我的错误。我应该像这样在json_decode函数中将 true 添加为第二个参数:
$array = json_decode(json_encode($result->toArray(),true),true);
这会将BSON文档转换为数组,而不是一行中的std对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。