Actualmente, cada documento obtenido de Mongo DB va a un objeto stdClass . Me gustaría cargar esto directamente en mi propia clase personalizada.
La clase
class TestClass { private $id; private $class; function __construct($id, $name) { $this->id = $id; $this->class = $class; } }El código
$m = MongoDB\Driver\Manager('mongodb://<user>:<pass>@<host>/<db>'); $query = MongoDB\Driver\Query(['name' => 'TestFirst']); // I tried adding the following line, but it says that the constructor args are missing. // If I omit it, it just adds each cursor object as an instance of stdClass $opt = ['cursor' => new TestClass]; $results = $m->executeQuery('newDb.testCollection', $query, $opt); foreach ($results as $document) { var_dump($document); } ¿Es posible lo que quiero lograr, o necesito pasar por cada objeto stdClass y convertirlo en una instancia de TestClass ?
La clase en sí necesita implementar la interfaz MongoDB\BSON\Unserializable y el bsonUnserialize(array $data) para convertir una matriz de datos BSON en la clase en cuestión.
class TestClass implements MongoDB\BSON\Unserializable, MongoDB\BSON\Serializable { private $id; private $name; function __construct ($id, $name) { $this->id = $id; $this->name = $name; } function bsonUnserialize(array $data) { // This will be called *instead* of the constructor if unserializing $this->id = $data['_id']; $this->id = $data['name']; } } El mapa de tipos de MongoDB\Driver\Cursor que se devuelve de la consulta debe configurarse para asignar un documento a una instancia de la clase personalizada. El código terminado se ve así.
$mongo = new MongoDB\Driver\Manager($constr); $query = MongoDB\Driver\Query(['name' => 'TestFirst']); $cursor = $mongo->executeQuery($query); $cursor->setTypeMap('root' => 'array', 'document' => 'TestClass', 'array' => 'array'); foreach ($cursor as $doc) { var_dump($doc); }