从 aggregate() 获取 PHP array() 或将 MongoDB\Driver\Cursor 转换为 array() 的正确方法

Proper way to get a PHP array() from aggregate() or convert a MongoDB\Driver\Cursor to array()

DB 上的一些文档有字段 'Assunto',我想计算 'Assunto' 的不同值出现了多少次(当该字段不存在时忽略,所以我做了这个查询:

$result = $collection->aggregate([
[ '$match' => ['Assunto' => ['$nin' => [null]]] ],
[ '$sortByCount'=> '$Assunto' ],
[ '$sort' => ['Count' => -1] ]
]);

查询工作正常,我的问题是来自聚合的 return。 From the documentation 它 return 是“A MongoDB\Driver\Cursor 或 ArrayIterator 对象”。

也来自文档 typeMap:“可选。应用于游标的类型映射,它决定了 BSON 文档如何转换为 PHP 值。默认为集合的类型映射。

我在 Stack Overflow 上阅读了有关更改集合的 typeMap 以将游标转换为数组的解决方案,但我无法让它们适用于我的情况,据我了解,我有多个 MongoDB\Driver\Cursor 而且它是return只有第一个。

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);

这会产生预期的输出。但是做所有这些过程似乎是一种浪费。在我的例子中,将 returned 值从聚合转换为数组的正确方法是什么?完整的代码片段以防有帮助:

$result = $collection->aggregate([
[ '$match' => ['Assunto' => ['$nin' => [null]]] ],
[ '$sortByCount'=> '$Assunto' ],
[ '$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 文档转换为数组而不是标准对象。