Usando a Biblioteca do PHP para o MongoDB (PHPLIB)

Após a configuração inicial da extensão, continuaremos explicando como começar a usar a biblioteca correspondente no nível do usuário para escrever nosso primeiro projeto.

Instalando a Biblioteca do PHP com o Composer

A última coisa que ainda precisamos instalar para começar a usar o aplicativo em si é a biblioteca PHP.

A biblioteca precisa ser instalada com o » Composer, um gerenciador de pacotes para PHP. Instruções para instalar o Composer em diversas plataformas podem ser encontradas em seu site.

Instale a biblioteca executando:

$ composer require mongodb/mongodb

O resultado será algo como:

./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

O Composer criará vários arquivos: composer.json, composer.lock e um diretório vendor que conterá a biblioteca e quaisquer outras dependências do seu projeto pode exigir.

Usando a Biblioteca do PHP

Além de gerenciar suas dependências, o Composer também fornecerá um carregador automático (para as classes dessas dependências). Certifique-se de que ele esteja incluído no início do seu script ou no código de inicialização da sua aplicação:

<?php
// Este caminho deve apontar para o carregador automático do Composer
require 'vendor/autoload.php';

Com isto feito, agora você pode usar qualquer funcionalidade descrita na » documentação da biblioteca.

Se você usou drivers MongoDB em outras linguagens, a API da biblioteca deverá parecer familiar. Ele contém uma classe » Client para conexão com o MongoDB, uma classe » Database para operações em nível de banco de dados (por exemplo, comandos, gerenciamento de coleção) e uma classe » Collection para operações em nível de coleção (por exemplo, métodos » CRUD, gerenciamento de índice).

Por exemplo, é assim que você insere um documento na coleção beers do banco de dados demo:

<?php
require 'vendor/autoload.php'; // inclui o auto-carregador do Composer

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

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

echo
"Inserido com ID do Objeto '{$result->getInsertedId()}'";
?>

Como o documento inserido não continha um campo _id, a extensão irá gerar um MongoDB\BSON\ObjectId para o servidor usar como _id. Este valor também é disponibilizado ao chamador por meio do objeto de resultado retornado pelo método insertOne.

Após a inserção, você pode consultar os dados que acabou de inserir. Para isso, você usa o método find, que retorna um cursor iterável:

<?php
require 'vendor/autoload.php'; // inclui o auto-carregador do 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";
}
?>

Embora possa não ser aparente nos exemplos, os documentos e arrays do BSON são desserializados como classes especiais na biblioteca por padrão. Essas classes estendem ArrayObject para usabilidade e implementam as interfaces MongoDB\BSON\Serializable e MongoDB\BSON\Unserializable da extensão para garantir que os valores preservem seu tipo quando serializados de volta para BSON. Isso evita uma ressalva na extensão mongo legada, onde arrays podem se transformar em documentos e vice-versa. Consulte a especificação Dados Persistentes para obter mais informações sobre como os valores são convertidos entre PHP e BSON.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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
7 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