我正在从mongodb数据库读取一个文档,并将它与php一起传递给客户端。
文档包含一个数组属性。问题是,客户端将其作为一个具有名称为0、1等属性的对象来接收,而不是标准数组。
这是原始数据:
{
"_id" : ObjectId("573b47a1f99a8a1f9a6278a5"),
"persons" : [
{
"name" : "Moshe",
},
{
"name" : "E",
}, ...
]
}根据请求,我将附加var_export:
array (
0 =>
MongoDB\Model\BSONDocument::__set_state(array(
'_id' =>
MongoDB\BSON\ObjectID::__set_state(array(
)),
'persons' =>
MongoDB\Model\BSONArray::__set_state(array(
0 =>
MongoDB\Model\BSONDocument::__set_state(array(
'name' => 'Moshe',
)),
1 =>
MongoDB\Model\BSONDocument::__set_state(array(
'name' => 'E',
)),
)),
)),
)和var_dump:
array(1) {
[0]=>
object(MongoDB\Model\BSONDocument)#40 (1) {
["storage":"ArrayObject":private]=>
array(2) {
["_id"]=>
object(MongoDB\BSON\ObjectID)#11 (1) {
["oid"]=>
string(24) "573b47a1f99a8d1f986278a5"
}
["persons"]=>
object(MongoDB\Model\BSONArray)#34 (1) {
["storage":"ArrayObject":private]=>
array(2) {
[0]=>
object(MongoDB\Model\BSONDocument)#10 (1) {
["storage":"ArrayObject":private]=>
array(1) {
["name"]=>
string(5) "Moshe"
}
}
[1]=>
object(MongoDB\Model\BSONDocument)#12 (1) {
["storage":"ArrayObject":private]=>
array(1) {
["name"]=>
string(1) "E"
}
}
}
}
}
}
}这是PHP代码(全部):
function select(){
$conn = new MongoDB\Client("mongodb://localhost:27017");
$db = $conn->mydb;
$cursor = $db->entries_meta_data->find();
return current($cursor->toArray());
}然后,我用这样的json_encode将对象传递给客户端:
echo json_encode(select());在客户端出现的结果是:
{
"_id" : ObjectId("573b47a1f99a8a1f9a6278a5"),
"persons" : {
"0" : {
"name" : "Moshe",
},
"1" : {
"name" : "E",
}, ...
}
}编辑: LordNeo实际上解决了这个问题。在阅读了他的答案后,我将我的"select“函数的最后一行更改为:
return json_decode(json_encode(current($cursor->toArray()),true);看上去很可怕,但很管用。
我将非常乐意听到更好的解决办法。
发布于 2016-08-28 00:15:26
MongoDB驱动程序提供一个MongoDB\BSON\toJSON()函数,该函数正确地将数据转换为JSON。因为它需要一个字符串作为输入,所以首先需要调用文档上的MongoDB\BSON\fromPHP()。由于您只想获得第一个查找元素,所以可以使用findOne()方法而不是find(),这使得获得输出非常容易:
function select() {
$conn = new MongoDB\Client("mongodb://localhost:27017");
$db = $conn->mydb;
$doc = $db->entries_meta_data->findOne();
return MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($doc));
}如果您想要输出多个条目,它会变得更加复杂。输出数组的一种方法(无可否认是恶意的)如下所示:
function select() {
$conn = new MongoDB\Client("mongodb://localhost:27017");
$db = $conn->mydb;
$cursor = $db->entries_meta_data->find();
$result = $cursor->toArray();
foreach($result as $i => $doc) {
$result[$i] = MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($doc));
}
return '[' . implode($res) . ']';
}另一种方法是在BSONArray类被json_encode()调用时调整其输出。为此,您需要调整当BSONArray.php位于‘设置MongoDB驱动程序 /mongodb/mongodb/src/Model’文件夹中时得到的JsonSerializable文件,并添加JsonSerializable接口和jsonSerialize()方法,使其如下所示:
<?php
...
class BSONArray extends ArrayObject implements \JsonSerializable,
Serializable, Unserializable
{
...
/**
* Serialize the ArrayObject as normal array
*
* @return array
*/
public function jsonSerialize() {
return $this->getArrayCopy();
}
}https://stackoverflow.com/questions/37283350
复制相似问题