php 将MongoCursor从->find()转换为数组

ecr0jaav  于 2023-06-04  发布在  PHP
关注(0)|答案(8)|浏览(341)
$jokes = $collection->find();

如何将$jokes转换为数组?

b1uwtaje

b1uwtaje1#

您可以使用PHP的iterator_to_array函数,如MongoCursor docs的示例1所示:

$jokes = $collection->find();
$jokesArray = iterator_to_array($jokes);
kdfy810k

kdfy810k2#

iterator_to_array不适用于嵌套超过2层,

使用typeMap可以将根目录及其文档转换为数组,适用于任何嵌套级别

findOne($filter,$options)

$options = ["typeMap" => ['root' => 'array', 'document' => 'array']];
$collection->findOne(['myId' => $id ], $options); // returns array

find($filter,$options)

$options = ["typeMap" => ['root' => 'array', 'document' => 'array']];
$collection->find(['myId' => $id ], $options)->toArray();
q35jwt9p

q35jwt9p3#

作为Chris回答的一个旁注:
array iterator_to_array(Traversable $iterator [,bool $use_keys = true ])
注意可选的第二个参数,如果它设置为true(默认值),最终的数组将使用每个文档的“_id”字段进行索引。
如果在Mongo查询中应用了排序,那么最终的数组可能不是您所期望的,这意味着排序顺序将不会被保留(除非您将**$use_keys参数设置为false**)

ohfgkhjo

ohfgkhjo4#

iterator_to_array()强制驱动程序将所有结果加载到内存中,**所以不要对大于内存的结果集执行此操作!**使用这个

$jokes = $collection->find();
foreach ($jokes as $joke) {
    var_dump($joke);
}
lb3vh1jj

lb3vh1jj5#

更容易:

findeOne()->getArrayCopy();

如前所述:注意不要加载大型结果集并将其转换为数组
也可以使用typeMap选项设置首选项

'typeMap' =>[
      'document' => 'array',
       'root' => 'array'
                ]
9bfwbjaz

9bfwbjaz6#

我对多维结果有异议。要将多维结果转换为数组,您可以使用下面的函数。

public function convertMongoResultToArray($result)
{
    if (is_object($result)) {
        if ($result instanceof \MongoDB\Model\BSONDocument) {
            $result = $result->getArrayCopy();
        } elseif ($result instanceof \MongoDB\Model\BSONArray) {
            $result = iterator_to_array($result);
        } elseif ($result instanceof \MongoDB\BSON\ObjectId) {
            $result = (string) $result;
        }

        if (is_array($result)) {
            foreach ($result as $key => $value) {
                $result[$key] = $this->convertMongoResultToArray($value);
            }
        }
    }

    return $result;
}

对于上面的函数,你可以传递mongo查询的结果。
在函数中,我们将转换可能的三种不同类型的对象到数组中。
1.\MongoDB\Model\BSONDocument
1.\MongoDB\Model\BSONArray
1.\MongoDB\BSON\ObjectId
我们将循环遍历结果的每个键,如果键组成数组,则递归调用函数。
最终结果将提供php数组。

iq0todco

iq0todco7#

find()返回MongoDB游标http://www.php.net/manual/en/mongocollection.find.php
这应该对你的案子有用

$cursor = $collection->find();
foreach($cursor as $jokes) {
 print_r($jokes);
}
gfttwv5a

gfttwv5a8#

如果有人来到这里,你也可以使用toArray方法。
(mongodb >=1.0.0)
MongoDB\Driver\Cursor::toArray -返回一个数组,其中包含此游标的所有结果

$jokes = $collection->find()->toArray();

或:

$jokes = $collection->find();
$jokesArray = $jokes->toArray();

相关问题