我遇到了php的新mongodb驱动程序的问题。 虽然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?
答案 0 :(得分:2)
您可以在database->setCollection
选项中设置数据的全局返回方式,将typeMap设置为array
'typeMap' =>[
'document' => 'array',
'root' => 'array'
]
答案 1 :(得分:0)
我在PHP MongoDB库中找不到@Delcon建议的setCollection,因此我使用了以下方法。
typeMap选项也可以在findOne内的options数组中设置。
$someCollection->findOne(
[],
['typeMap' => ['root' => 'array', 'document' => 'array', 'array' => 'array']]
);
编辑:
您还可以将options数组传递到连接器,以按照此Stackoverflow帖子中的说明进行全局设置。
$options = ["typeMap" => ['root' => 'array', 'document' => 'array']];
$conn = new MongoDB\Client("mongodb://localhost:27017", [], $options);