PHP 8.4.2 Released!

Empleo de la biblioteca de PHP para MongoDB (PHPLIB)

Después de la configuración inicial del controlador, continuaremos explicando cómo empezar con el controlador de MongoDB y la correspondiente biblioteca de usuario para escribir nuestro primer proyecto.

Instalación de la Biblioteca de PHP con Composer

Lo último que necesitamos instalar para empezar con la apliación en sí, es la biblioteca de PHP.

La bibilioteca necesita ser instalada con » Composer, un gestor de paquetes para PHP. Las instrucciones para instalar Composer en varias plataformas se pueden encontrar en su sitio web.

Instale la biblioteca ejecutando:

$ composer require "mongodb/mongodb=^1.0.0"

Muestra algo parecido a esto:

./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing mongodb/mongodb (1.0.0)
    Downloading: 100%         

Writing lock file
Generating autoload files

Composer creará varios ficheros: composer.json, composer.lock, y un directorio vendor que contendrá la biblioteca y cualquier otra dependencia que requiera el proyecto.

Utilizar la Biblioteca de PHP

Además de gestionar las dependencias, Composer también proporciona un autocargador (para las clases de las dependencias). Asegúrese que se incluye al inicio del script o en el código de arranque de la aplicación:

<?php
// Esta ruta debe apuntar al autocargador de Composer
require 'vendor/autoload.php';

Con esto hecho, ahora se puede emplear cualquier funcionalidad de la descrita en la » documentación de la biblioteca y en su » API.

Si ha empleado anteriormente el controlador antiguo (esto es, la extensión mongo), la API de la biblioteca debería serle familiar. Contiene una clase » Client para conectar a MongoDB, una clase » Database para operaciones a nivel de la base de datos (p.ej. comandos , gestión de colecciones) y una clase » Collection para operaciones a nivel de colección (p.ej. métodos » CRUD, gestión de índices). Se han renombrado varios métodos de Collection para mayor claridad y para estar en concordancia con una nueva » specification independiente del lenguaje.

Como ejemplo, así es como se inserta un documento en la colección beers de la base de datos demo:

<?php
require 'vendor/autoload.php'; // incluir lo bueno de Composer

$cliente = new MongoDB\Client("mongodb://localhost:27017");
$colección = $cliente->demo->beers;

$resultado = $colección->insertOne( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

echo
"Inserted with Object ID '{$resultado->getInsertedId()}'";
?>

En lugar de inyectar el campo _id generado en el documento de entrada (tal como se hacía en el antiguo controlador), ahora se pone a disposición mediante el objeto de resultados devuelto por el método insertOne.

Por supuesto, después de la inserción también se pueden consultar los datos que se acaban de insertar. Para ello se utiliza el método find, el cual devuelve un cursor iterable:

<?php
require 'vendor/autoload.php'; // include Composer goodies

$cliente = new MongoDB\DriverMongoDB\Client("mongodb://localhost:27017");\Client("mongodb://localhost:27017");
$colección = $cliente->demo->beers;

$resultado = $colección->find( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

foreach (
$resultado as $entry) {
echo
$entry['_id'], ': ', $entry['name'], "\n";
}
?>

Anuque pueda no ser evidente en los ejemplos, los documentos BSON y los arrays son deserializados como clases de tipo en la biblioteca de forma predeterminada. Estas clases aseguran que los valores preservan sus tipos cuando son serializados de nuevo a BSON, lo cual evita una advertencia del antiguo controlador cuando un array podía convertise a un documento, y viceversa. Además, las clases extienden ArrayObject para mejorar la usabilidad. Se puede encontrar más información sobre cómo el controlador y la biblioteca manejan la serialización y deserialización entre variablies de PHP y BSON leyendo la especificicación de Persistencia de datos.

add a note

User Contributed Notes 7 notes

up
22
surajtiwari020 at gmail dot com
6 years ago
Well most of the tutorials didn't explained well, So i hope this might help someone
Note: this is a part of my laravel project

//getting data from a collection
<?php

use MongoDB\Client as Mongo;

$user = "admin";
$pwd = 'password';

$mongo = new Mongo("mongodb://${user}:${pwd}@127.0.0.1:27017");
$collection = $mongo->db_name->collection;
$result = $collection->find()->toArray();

print_r($result);

?>
up
10
salos_12 at hotmail dot com
5 years ago
When your database name contains a "-" (e.g. database-name) you need to use a string instead.

<?php

$client
= new MongoDB\Client("mongodb://ip_address:port");
$collection = $client->{'database-name'}->collection;

?>
up
4
wpg
5 years ago
If you have a number of JSON documents with nested elements such as 'responseId' below and you want to know how many documents have a responseId:
{"result":{"responseId":"xyz"}}
{"result":NULL}
{"result":{"responseId":"abc"}}

I was not having luck with the following format
<?php
// trying to get the count of documents where responseId is not equal to NULL (did not work for me)
$intCount = $collection->count(['result' => ['responseId' => ['$ne' => NULL]]]);
?>

Instead I needed to use a period between the JSON elements:
<?php
// get the count of documents where responseId is not equal to NULL
$intCount = $collection->count(['result.responseId' => ['$ne' => NULL]]);
?>
up
9
crystale dot darck at gmail dot com
7 years ago
To test your connection string, you can do something like this:

<?php
$mongo
= new MongoDB\Client('mongodb://my_server_does_not_exist_here:27017');
try
{
$dbs = $mongo->listDatabases();
}
catch (
MongoDB\Driver\Exception\ConnectionTimeoutException $e)
{
// PHP cannot find a MongoDB server using the MongoDB connection string specified
// do something here
}
?>
up
6
Dc Shiman
8 years ago
Do a text search on the collection with projection

$search['$text'] = ['$search' => "foo"];
$options["projection"] = ['score' => ['$meta' => "textScore"]];
$options["sort"] = ["score" => ['$meta' => "textScore"]];

$cursor = $collection->find($search, $options);
up
4
Basher
8 years ago
Pecl MongoDB at time of writing can be installed (see phpinfo()) but composer will complain that it's not present.

$ composer require "mongodb/mongodb=^1.0.0"
...
Your requirements could not be resolved to an installable set of packages.

If you see this try

$ composer require "mongodb/mongodb=^1.0.0" --ignore-platform-reqs
up
0
drankinatty at NOSPAMgmail dot com
1 month ago
One question that was unanswered was how to handle insertion of a full JSON document provided as an argument (or in a string variable). The mongodb extension can handle this by simply using json_decode() to convert the JSON document to an object that can then be easily inserted, e.g. (with full document provided as the 2nd command-line argument)

<?php
/* include libmongo API */
require "vendor/autoload.php";

/* include connection string, db and collection values */
require __DIR__ . '/site/db-mongo-inc.php';

/* use MongoDBClient; */
use MongoDB\Client;

/* connection string */
$uri = "mongodb://$user:$pass@localhost";

/* attempt connection to database with $uri */
$client = new MongoDB\Client("$uri");
if (!isset(
$client)) {
echo
'error: connection failed';
}

/* define collection of documents */
$collection = $client->$db->$collection;

/* insert JSON document from string variable (here $argv[2]) */
if ($argc > 2) {
$jsobj = json_decode ($argv[2]);
if (
$jsobj) {
$iresult = $collection->insertOne ( $jsobj );
if (!
$iresult) {
printf ("error: insert of object failed.\n");
}
}
}
?>

The extension's block insert feature recursively resolves all field and data values contained in the object and inserts the entire document in the collection. It is helpful to remove the "_id:" field and have that auto-generated for you to avoid issues.
To Top