【问题标题】:Convert a MongoCursor from ->find() to an array将 MongoCursor 从 ->find() 转换为数组
【发布时间】:2011-10-06 03:22:56
【问题描述】:
$jokes = $collection->find();

如何将$jokes 转换为数组?

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

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

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

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

    【讨论】:

    • Hello @satya-prakash-patel -- 有没有办法为所有 find 和 findOne 操作全局设置它,这样就不必在每个查询中都提供它作为选项?谢谢。
    • 没关系,那条评论,看起来您也可以将类型映射作为连接器上的选项传递。例如:$conn = new MongoDB\Client("mongodb://localhost:27017", [], $options);
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      作为 Chris 回答的旁注:

      array iterator_to_array ( Traversable $iterator [, bool $use_keys = 真的])

      注意可选的第二个参数,如果设置为true(默认),最终数组将使用每个文档中的“_id”字段进行索引。

      如果您在 mongo 查询中应用了排序,最终的数组可能不是您所期望的,这意味着不会保留排序顺序(除非您将 $use_keys 参数设置为

      【讨论】:

      • 注意:这也会删除关联数组键并将它们更改为数字。
      【解决方案4】:

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

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

      【讨论】:

      • 将结果作为 mongodb 的数组获取是最佳实践吗?
      • 这非常方便,因为有些操作不能在游标上进行,只需转换为 json
      • 感谢@Chris Henry
      【解决方案5】:

      如果有人来这里,你也可以使用toArray方法。

      (mongodb >=1.0.0)

      MongoDB\Driver\Cursor::toArray — 返回一个包含所有 此光标的结果

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

      或:

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

      【讨论】:

        【解决方案6】:

        容易多了:

        findeOne()->getArrayCopy();
        

        如前所述:小心加载大型结果集并将它们转换为数组

        您还可以使用 typeMap 选项设置您的偏好

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

        【讨论】:

          【解决方案7】:

          find() 基本上返回 MongoDB 游标http://www.php.net/manual/en/mongocollection.find.php

          这应该适用于您的情况

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

          【讨论】:

          • @xe4me 它不回答问题这一事实似乎有点缺陷。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          • 2018-12-22
          • 1970-01-01
          • 2022-09-26
          • 2017-08-11
          相关资源
          最近更新 更多