PHP 8.4.0 RC4 available for testing

Utiliser la bibliothèque PHP pour MongoDB (PHPLIB)

Après la configuration initiale de l'extension, nous allons continuer à expliquer comment démarrer avec la bibliothèque utilisateur correspondante pour écrire notre premier projet.

Installer la bibliothèque PHP avec Composer

La dernière chose que nous devons installer pour commencer l'application elle-même est la bibliothèque PHP.

La bibliothèque doit être installée avec » Composer, un gestionnaire de paquets pour PHP. Les instructions pour installer Composer sur différentes plateformes peuvent être trouvées sur son site web.

Installer la bibliothèque en exécutant:

$ composer require mongodb/mongodb

Cela produira une sortie similaire à:

./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 va créer plusieurs fichiers: composer.json, composer.lock, et un répertoire vendor qui contiendra la bibliothèque et toutes les autres dépendances que votre projet pourrait nécessiter.

Utiliser la bibliothèque PHP

En plus de gérer vos dépendances, Composer vous fournira également un autochargement (pour les classes de ces dépendances). Assurez-vous qu'il est inclus au début de votre script ou dans le code d'amorçage de votre application:

<?php
// Ce chemin doit pointer vers l'autochargeur de Composer
require 'vendor/autoload.php';

Avec cela fait, vous pouvez maintenant utiliser n'importe quelle fonctionnalité comme décrit dans la » documentation de la bibliothèque.

Si vous avez utilisé des pilotes MongoDB dans d'autres langages, l'API de la bibliothèque devrait vous sembler familière. Elle contient une classe » Client pour se connecter à MongoDB, une classe » Database pour les opérations au niveau de la base de données (par exemple, les commandes, la gestion des collections), et une classe » Collection pour les opérations au niveau de la collection (par exemple, les méthodes » CRUD, la gestion des index).

En tant qu'exemple, voici comment vous insérez un document dans la collection beers de la base de données demo:

<?php
require 'vendor/autoload.php'; // inclure l'autochargeur de Composer

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->beers;

$result = $collection->insertOne( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

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

Depuis le document inséré ne contenait pas de champ _id, l'extension va générer un MongoDB\BSON\ObjectId pour que le serveur l'utilise comme _id. Cette valeur est également disponible pour l'appelant via l'objet de résultat retourné par la méthode insertOne.

Après l'insertion, vous pouvez interroger les données que vous venez d'insérer. Pour cela, vous utilisez la méthode find, qui retourne un curseur itérable:

<?php
require 'vendor/autoload.php'; // inclure l'autochargeur de Composer

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->beers;

$result = $collection->find( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

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

Tandis que les exemples ne le montrent pas, les documents BSON et les tableaux sont désérialisés en tant que classes spéciales dans la bibliothèque par défaut. Ces classes étendent ArrayObject pour la facilité d'utilisation et implémentent les interfaces MongoDB\BSON\Serializable et MongoDB\BSON\Unserializable de l'extension pour garantir que les valeurs conservent leur type lorsqu'elles sont sérialisées de nouveau en BSON. Cela évite un inconvénient de l'ancienne extension mongo où les tableaux pourraient se transformer en documents, et vice versa. Voir la spécification Persister des données pour plus d'informations sur la façon dont les valeurs sont converties entre PHP et BSON.

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
5 days 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