Как преобразовать MongoDB BSONDocument в действительный JSON в PHP?

Я использую MongoDB с библиотекой PHP. Я вставил действительный документ JSON в MongoDB, используя PHP. Я сейчас получаю документ, используя findOne и в результате я получаю объект MongoDB \ Model \ BSONDocument. Как мне легко вернуть мой документ JSON? Есть ли встроенная функция или мне придется написать логику для преобразования BSONDocument в JSON?

10

Решение

Я не видел здесь никаких ответов, и у меня возникла та же проблема. Я провел некоторые исследования, и кажется, что при создании документа MongoDB \ Model \ BSONDocument существует метод bsonSerialize (). Этот метод вернет объект stdClass, который на самом деле является классом PHP Array. Согласно документации, можно преобразовать PHP в BSON, а затем в JSON.

Это выглядит безумно, но это работает. Вот мой пример, $ accountResultDoc имеет тип MongoDB \ Model \ BSONDocument.

$json = MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($accountResultDoc))

Результаты

{
"_id": {
"$oid": "56e1d8c31d41c849fb292184"},
"accountName": "Michael's Test Company",
"accountType": "Partner",
"subsidiary_id": {
"$oid": "563c3ffbaca6f518d80303ce"},
"salesforceId": "WERWERWEr2",
"netsuiteExternalId": "56e1d8c31d41c849fb292184",
"suspendBilling": false,
"testAccount": false,
"serviceOrder_ids": null,
"invoice_ids": null
}
11

Другие решения

Другой способ будет:

json_encode( $bsonDoc->getArrayCopy() );

3

Объект BSONDocument имеет метод jsonSerialize. Используйте это:

пример

{"_id" : 12345,
"filename" : "myfile",
"header" : {
"version" : 2,
"registry" : "test",
"serial" : 20080215,
"records" : 17806,
"startDate" : 19850701,
"endDate" : 20080214
},
}

$connect = new MongoDB\Client('mongodb://yourconnection');
$db = $connect->YourDB;
$collection = $db->YourCollection;

$test = $collection->findOne(array("_id"=>12345));
$data = $test->jsonSerialize();

echo $data->_id;
echo $data->filename;

Будет выводить это:

12345
myfile
2

У меня была такая же проблема, и вот как я получил доступ к значениям внутри. Это работает с find,

foreach ($result as $entry) {
echo $entry['_id'], $entry['val1'], ['val2'];
}

Надеюсь, это кому-нибудь поможет.

0