【问题标题】:Convert PHP mongodb findOne result to old associative array?将 PHP mongodb findOne 结果转换为旧的关联数组?
【发布时间】:2020-05-23 20:43:56
【问题描述】:

我在使用新的 mongodb php 驱动程序时遇到问题。 虽然 iterator_to_array 适用于 ->find,但如果我只返回一个文档,它具有 MongoDB\Model\BSONDocument 格式。

$result = $db->clients->findOne(array('_id' => $id));
$result = (array) $result;

在 Mongo 中,文档看起来像:

{ 
    "_id" : ObjectId("3894713i4b13iu412"), 
    "active" : true, 
    "logo" : "this is logo", 
    "settings" : {
        "email" : "days", 
        "testMode" : false
    }, 
    "stats" : {
        "f" : {
            "all" : [
                {
                    "count" : NumberLong(15846), 
                    "sum" : NumberLong(149479)
                }, 
                {
                    "count" : NumberLong(15846), 
                    "sum" : NumberLong(148891)
                }, 
                {
                    "count" : NumberLong(15846), 
                    "sum" : {
                        "1" : NumberLong(15522), 
                        "2" : NumberLong(324)
                    }
                }
            ]
        }, 
        "l" : {
            "order" : ISODate("2016-12-05T09:10:53.855+0000"), 
            "feedback" : ISODate("2016-12-05T08:34:48.403+0000")
        }
    }, 
    "title" : "hhh.ro", 
    "url" : "sdfasdf"
}

这只会将第一级元素转换为数组,但嵌套的文档元素仍保留为 MongoDB\Model\BSONDocument;

iterator_to_array 不起作用,因为这不是可迭代的。

如何将整个文档转换为关联数组,如旧的 mongo 驱动程序或 stdClass?

【问题讨论】:

  • 也许你可以试试这个 json_decode(json_encode($result), true);
  • 它使 _id 像这样 ["$oid"]=> string(24) "5784d428f079959a088b4595"
  • 你试过这个 $db->clients->findOne(array('_id' => $id))->toArray()
  • 用于查找。 findOne 不返回迭代器。是的,我尝试了 toArray。

标签: php arrays mongodb


【解决方案1】:

您可以在database->setCollection选项中设置数据如何全局返回,将typeMap设置为数组

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

Link to Doc

【讨论】:

【解决方案2】:

我在 PHP MongoDB 库中找不到@Delcon 建议的 setCollection,所以我使用了以下方法。

typeMap选项也可以在findOne里面的options数组中设置。

$someCollection->findOne(
[],
['typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array']]
);

Link to Doc

编辑:

您还可以将选项数组传递给连接器,以按照Stackoverflow 帖子所述进行全局设置。

$options = ["typeMap" => ['root' => 'array', 'document' => 'array']];
$conn = new MongoDB\Client("mongodb://localhost:27017", [], $options);

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2011-04-13
    • 2011-05-08
    • 2012-01-20
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多