Comment convertir MongoDB BSONDocument en JSON valide en PHP?

J'utilise MongoDB avec la bibliothèque PHP. J'ai inséré un document JSON valide dans MongoDB en utilisant PHP. Je suis maintenant en train de récupérer le document en utilisant findOne et j'obtiens un MongoDBModelBSONDocument objet comme un résultat. Comment puis-je récupérer facilement mon document JSON? Y a-t-il une fonction intégrée ou vais-je devoir écrire de la logique pour convertir le BSONDocument en JSON?

10
demandé sur sawrubh 2016-02-18 07:25:08

4 réponses

Je n'ai pas vu de réponses ici et j'avais le même problème. J'ai fait quelques recherches et il apparaît que lorsque vous créez un document de MongoDB\Model\BSONDocument il y a une méthode bsonSerialize (). Cette méthode retournera un objet stdClass qui est vraiment la classe PHP Array. Selon la documentation on peut alors convertir de PHP en BSON et puis en JSON.

C'est bizarre, mais ça fonctionne. Voici mon exemple $ accountResultDoc est de MongoDB\Model\BSONDocument type.

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

Résultats

{
  "_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
répondu pitchblack408 2016-03-11 08:33:14

une Autre solution serait:

json_encode( $bsonDoc->getArrayCopy() );

3
répondu Marius.C 2016-11-21 18:02:52

L'objet BSONDocument a une méthode jsonSerialize. Utiliser:

Exemple

{"_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;

sortie:

12345
myfile 
2
répondu Andre 2017-08-03 03:54:39

j'ai eu le même problème et c'est comme ça que j'ai accédé aux valeurs à l'intérieur. Cela fonctionne avec find.

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

Espérons que cela aide quelqu'un.

0
répondu Saahithyan Vigneswaran 2016-11-28 18:42:18