Gracias al driver de PHP para MongoDB de 10gen.
Código de ejemplo para conectar, insertar documentos, consultar documentos, recorrer el resultado de una consulta, y desconectar de MongoDB. Encontrará más detalles en cada uno de los pasos del siguiente tutorial.
<?php
// conectar
$m = new Mongo();
// seleccionar una base de datos
$db = $m->comedy;
// seleccionar una colección (equivalente a una tabla en una base de datos relacional)
$collection = $db->cartoons;
// añadir un registro
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);
// añadir un nuevo registro, con un distinto "perfil"
$obj = array( "title" => "XKCD", "online" => true );
$collection->insert($obj);
// encontrar todo lo que haya en la colección
$cursor = $collection->find();
// recorrer el resultado
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
?>
Mostrará:
Calvin and Hobbes XKCD
Para conectar al servidor de bases de datos, utilice alguna de las siguientes formas:
<?php
$connection = new Mongo(); // conecta a localhost:27017
$connection = new Mongo( "example.com" ); // conecta a un host remoto (puerto por omisión: 27017)
$connection = new Mongo( "example.com:65432" ); // conecta a un host remoto en el puerto facilitado
?>
No es necesario desconectar explícitamente de la base de datos. Cuando $connection queda fuera de ámbito, la conexión se cierra automáticamente y todos sus recursos se liberan.
El capítulo connecting cubre los distintos tipos de conexiones.
Tanto la documentación de la API de la clase Mongo como Mongo::__construct() proporcionan un exhaustivo repaso a todas las opciones disponibles, y un gran número de ejemplos.
Para seleccionar una base de datos, utilice.
<?php
$db = $connection->dbname;
?>
La base de datos no debe necesariamente haber sido ya creada, sino que pueden crearse con sólo seleccionarlas.
¡Tenga cuidado con los errores tipográficos! Podría, por inadvertencia, crear una nueva base de datos, provocando errores:
<?php
$db = $connection->mybiglongdbname;
// hacemos algo
$db = $connection->mybiglongdbname;
// ¡ahora estamos conectando a una nueva base de datos!
?>
La documentación API de la clase MongoDB contiene más información sobre los objetos de bases de datos.
Para obtener una conexión se utiliza la misma sintaxis que para obtener una base de datos:
<?php
$db = $connection->baz;
$collection = $db->foobar;
// o de forma resumida:
$collection = $connection->baz->foobar;
?>
Las colecciones son análogos a las tablas (para aquéllos que estén familiarizados con bases de datos relacionales).
La documentación API de la clase MongoCollection contiene más información sobre objetos de colecciones.
Los objetos básicos para almacenar en una colección de una base de datos son los arrays asociativos. Un "documento" cualquiera podría ser:
<?php
$doc = array( "nombre" => "MongoDB",
"tipo" => "database",
"contador" => 1,
"info" => (object)array( "x" => 203, "y" => 102),
"versiones" => array("0.9.7", "0.9.8", "0.9.9")
);
?>
Tenga en cuenta que puede tener array y objetos anidados.
Para insertar este documento, utilice MongoCollection::insert():
<?php
$collection->insert( $doc );
?>
La documentación API de MongoCollection::insert() contiene más información sobre la inserción de datos.
Para comprobar que el documento que insertamos en el paso anterior se encuentra ahí, podemos realizar una operación MongoCollection::findOne() para obtener un único documento de la colección. Este método es útil cuando sólo hay un documento que concuerde con la consulta, o cuando sólo se está interesado en un resultado.
<?php
$obj = $collection->findOne();
var_dump( $obj );
?>
Mostrará:
array(6) { ["_id"]=> object(MongoId)#8 (1) { ["$id"]=> string(24) "4e2995576803fab768000000" } ["nombre"] string(7) "MongoDB" ["tipo"]=> string(8) "database" ["contador"]=> int(1) ["info"]=> array(2) { ["x"]=> int(203) ["y"]=> int(102) } ["versiones"]=> array(3) { [0]=> string(5) "0.9.7" [1]=> string(5) "0.9.8" [2]=> string(5) "0.9.9" } }
Hay un campo _id que se ha añadido automáticamente al documento. _id es el campo de la "clave primaria". Si el documento no especifica una, el driver la añadirá automáticamente.
Si se ha especificado un campo _id, debe ser único en toda la colección. Por ejemplo:
<?php
$db->foo->insert(array("_id" => 1), array("safe" => true));
// esto emitirá una excepción
$db->foo->insert(array("_id" => 1), array("safe" => true));
// aquí no habría problemas, ya que es otra colección
$db->bar->insert(array("_id" => 1), array("safe" => true));
?>
Tenga en cuenta que estas inserciones proporcionan un segundo array: array("safe" => true). Este campo especifica las opciones de inserción. Por omisión, el driver no espera para escribir a que la base de datos responda, por lo que el driver no capturaría el _id. Como se ha especificado una escritura "safe" (segura), el driver esperará la respuesta de la base de datos y verá que la escritura no se ha llevado a cabo. En general, todas las escrituras deben usar la opción "safe" (en los ejemplos anteriores se ha omitido para simplificarlos).
MongoCollection::findOne() contiene más información sobre cómo localizar datos.
MongoId ofrece más detalles de los identificadores únicos.
La sección writes trata las escrituras seguras en mayor profundidad, así como las funciones de escritura como MongoCollection::insert(), MongoCollection::update(), o MongoCollection::remove().
Para hacer más interesante el tema de las consultas, vamos a añadir varios documentos a la colección. Estos documentos serán simplemente de la forma array( "i" => value ); y podemos hacerlo de un modo muy eficiente en un bucle:
<?php
for($i=0; $i<100; $i++) {
$collection->insert( array( "i" => $i ) );
}
?>
Tenga en cuenta que podemos insertar en una misma colección arrays con conjuntos de claves diferente. A esta característica nos refereemos cuando decimos que MongoDB es independiente de esquemas.
Ahora que hemos insertado 101 documentos (los 100 del bucle, junto con el primero), podemos comprobar si los tenemos todos usando el método MongoCollection::count().
<?php
echo $collection->count();
?>
Paraa obtener todos los documentos, usaremos MongoCollection::find(). El método find() devuelve un objeto MongoCursor que nos permite recorrer el conjunto de documentos que concuerdan con nuestra consulta. De ese modo, para consultar todos los documentos y mostrarlos por pantalla:
<?php
$cursor = $collection->find();
foreach ($cursor as $id => $value) {
echo "$id: ";
var_dump( $value );
}
?>
La documentación API de MongoCollection::find() contiene más información sobre cómo localizar datos.
Podemos crear una consulta para pasar al método MongoCollection::find() y así obtener un subconjunto de documentos de nuestra colección. Por ejemplo, si quisiéramos encontrar el documento cuyo valor en el campo "i" es 71, haríamos lo siguiente:
<?php
$query = array( "i" => 71 );
$cursor = $collection->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
y debería mostrar un único documento
array(2) { ["_id"]=> object(MongoId)#6 (0) { } ["i"]=> int(71) ["_ns"]=> "testCollection" }
Podemos usar la consulta para obtener un conjunto de documentos de nuestra colección. Por ejemplo, si quisiéramos obtener todos los documentos en los que "i" > 50, podríamos poner:
<?php
$query = array( "i" => array( '$gt' => 50 ) ); //fíjese en las comillas simples de '$gt'
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
lo cual mostraría los documentos en que i > 50. Podemos también consultar un rango, digamos 20 < i <= 30:
<?php
$query = array( "i" => array( "\$gt" => 20, "\$lte" => 30 ) );
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
Recuerde escapar siempre el símbolo $ o utilizar comillas simples. Si no, PHP lo interpretará como la variable $gt.
MongoDB soporta índices, y es muy fácil añadirlos a una colección. Para crear un Índice, debe indicar el nombre del campo y la dirección: ascendente (1) o descendente (-1). A continuación, creamos un índice ascendente en el campo "i":
<?php
$coll->ensureIndex( array( "i" => 1 ) ); // creamos un índice en "i"
$coll->ensureIndex( array( "i" => -1, "j" => 1 ) ); // índice de "i" descendente, "j" ascendente
?>
A medida que los datos crecen, la indexación se vuelve crítica para un buen rendimiento de lectura. Si no está familiarizado con las indexaciones, revise la documentación de MongoCollection::ensureIndex() y l a » documentación de indexación de MongoDB.