Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
PHPchevron-right

Como criar um serviço de backend do Laravel + MongoDB

Hubert Nguyen15 min read • Published Aug 21, 2023 • Updated Oct 01, 2024
PHP
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
O Laravel é uma das principais estruturas de PHP que aumenta significativamente a produtividade de desenvolvedores PHP em todo o mundo. Eu costumava usar o WordPress, mas quando solicitado para construir um serviço web para um aplicativo de frontend, Laravel e MongoDB vêm à mente, especialmente quando combinados com a plataforma de dados para desenvolvedores MongoDB Atlas.
Este tutorial do Laravel MongoDB aborda desenvolvedores Laravel em potencial e existentes que estão considerando usar o MongoDB como banco de dados.
Vamos criar um back-end REST simples para um aplicativo front-end e abordar aspectos do MongoDB que podem ser novidade. O uso do MongoDB não afeta o aspecto de front-end da Web do Laravel, portanto, usaremos o roteamento da API integrada do Laravel neste artigo.
O suporte do MongoDB no Laravel é fornecido pelo pacote oficial mongodb/laravel-mongodb, que estende o Eloquent, o ORM integrado do Laravel.
Primeiro, vamos estabelecer uma linha de base criando um aplicativo Laravel padrão. Vamos espelhar algumas das instruções fornecidas em nossa página Integração do Laravel com o MongoDB, que é o principal ponto de entrada para todas as coisas relacionadas ao Laravel no MongoDB. Qualquer ambiente do Laravel deve funcionar, mas neste artigo usaremos alguns comandos do Linux no Ubuntu.

Pré-requisitos

Colocando o servidor web Laravel em funcionamento

Observação: continuaremos criando o projeto Laravel com o Composer, mas o repositório de código do artigo está disponível.
As instruções "Configurando e configurando seu projeto Laravel" na Integração do MongoDB e do Laravel mostram como configurar um ambiente de desenvolvimento Laravel-MongoDB. Abordaremos a criação do aplicativo Laravel e a configuração do MongoDB a seguir.
Aqui estão links úteis, apenas para garantir: 

Criar um projeto Laravel

Com nosso ambiente de desenvolvimento funcionando, vamos criar um projeto Laravel criando um diretório de projeto Laravel. De dentro desse novo diretório, crie um novo projeto Laravel chamado laraproject executando o comando, que especifica o uso do Laravel:
composer create-project laravel/laravel laraproject
Depois disso, a estrutura do seu diretório deve ficar assim:
1└── ./laraproject
2    ├── ./app
3    ├── ./artisan
4    ├── ./bootstrap
5    ├── ...
Depois que nosso ambiente de desenvolvimento estiver configurado corretamente, podemos navegar até o site do Laravel (provavelmente 'localhost', para a maioria das pessoas) e visualizar a página inicial:
A página inicial padrão do Laravel

Adicionar uma conexão Laravel ao MongoDB

Verifique se o driver MongoPHP está instalado e em execução Para verificar se o driver MongoDB está instalado e em execução em nosso servidor da web, podemos adicionar uma página da web ao nosso website do Laravel. No projeto do código, abra /routes/web.php e adicione uma rota desta forma:
1Route::get('/info', function () {
2 phpinfo();
3});
Em seguida, visite a página da Web em localhost/info/ e veremos a página PHPinfo. Ao procurar a seção MongoDB na página, devemos ver algo como o seguinte. Isso significa que o driver MongoDB PHP está carregado e pronto. Se houver erros de experiência, nosso tratamento de erros de PHP do MongoDB abordará problemas típicos.
Página PHPinfo, seção MongoDB
Podemos usar o Composer para adicionar o pacote Laravel MongoDB ao aplicativo. No prompt de comando, vá até o diretório do projeto e execute o comando abaixo para adicionar o pacote ao diretório <project>/vendor/.
composer require mongodb/laravel-mongodb:4.0.0
Em seguida, atualize a configuração do banco de dados para adicionar uma string de conexão e credenciais do MongoDB. Abra o arquivo /config/database.php e atualize a array 'conexão' da seguinte forma:
1'connections' => [
2 'mongodb' => [
3 'driver' => 'mongodb',
4 'dsn' => env('MONGODB_URI'),
5 'database' => 'YOUR_DATABASE_NAME',
6 ],
env('MONGODB_URI') refere-se ao conteúdo do arquivo .env padrão do projeto. Certifique-se de que esse arquivo não acabe no controle de origem. Abra o arquivo <project>/.env e adicione a variável de ambiente DB_URI com a string de conexão e as credenciais no formato:
MONGODB_URI=mongodb+srv://USERNAME:PASSWORD@clustername.subdomain.mongodb.net/?retryWrites=true&w=majority
Sua string de conexão pode parecer um pouco diferente. Saiba como obter a string de conexão no Atlas. Lembre-se de permitir que o IP do servidor da web acesse o MongoDB cluster. A maioria dos desenvolvedores adicionará seu IP atual ao cluster.
Em /config/database.php, podemos definir opcionalmente a conexão padrão do banco de dados. Na parte superior do arquivo, altere 'padrão' para isso:
'default' => env('DB_CONNECTION', 'mongodb'),
Nosso aplicativo Laravel pode se conectar ao nosso MongoDB database. Vamos criar um endpoint de API que o faça ping. Em /routes/api.php, adicione a rota abaixo, salve e visite localhost/api/ping/. A API deve retornar o objeto {"msg": "MongoDB está acessível! "}. Se houver uma mensagem de erro, provavelmente é um problema de configuração. Aqui estão algumas dicas gerais de tratamento de erros do PHP MongoDB.
1Route::get('/ping', function (Request $request) {
2    $connection = DB::connection('mongodb');
3    $msg = 'MongoDB is accessible!';
4    try {
5        $connection->command(['ping' => 1]);
6 } catch (\Exception $e) {
7        $msg = 'MongoDB is not accessible. Error: ' . $e->getMessage();
8    }
9    return ['msg' => $msg];
10});

Criar dados com o Eloquent do Laravel 

O Laravel vem com Eloquent, um ORM que abstrai o backend do banco de dados para que os usuários possam usar diferentes bancos de dados usando uma interface comum. Graças ao pacote Laravel MongoDB, os desenvolvedores podem optar por um MongoDB database para se beneficiar de um esquema flexível, desempenho superior e escalabilidade.
O Eloquent tem uma classe "Modelo", a interface entre nosso código e uma tabela de banco de dados específica (ou "coleção", na terminologia do MongoDB). As instâncias das classes Modelo representam linhas de tabelas em bancos de dados relacionais.
No MongoDB, eles são documentos na coleção. Em bancos de dados relacionais, podemos definir valores somente para colunas definidas no banco de dados, mas o MongoDB permite que qualquer campo seja definido.
Os modelos podem definir campos preenchíveis se quisermos impor um esquema de documento em nosso aplicativo e evitar problemas como erros de digitação do nome. Isso não é necessário se quisermos que a flexibilidade total de não ter esquema seja mais rápida.
Para novos desenvolvedores do Laravel, existem muitos recurso e metodologias do Eloquent. A documentação oficial do Eloquent é o melhor lugar para saber mais sobre isso. Por enquanto, destacaremos os aspectos mais importantes do uso do MongoDB com o Eloquent. Podemos usar o MongoDB e um banco de dados SQL no mesmo aplicativo Laravel. Cada modelo está associado a uma conexão ou a outra.

Modelo Eloquent clássico

Primeiro, criamos um modelo clássico com seu código de migração associado executando o comando:
php artisan make:model CustomerSQL --migration
Após a execução, o comando criou dois arquivos, <project>/app/Models/CustomerSQL.php e <project>/database/migrations/YY_MM_DD_xxxxxx_create_customer_s_q_l_s_table.php. O código de migração deve ser executado uma vez no prompt para inicializar a tabela e o esquema. Na classe Migração estendida, verifique o código na função up().
Editaremos a função up() da migração para criar um esquema de cliente simples como este:
1public function up()
2{
3 Schema::connection('mysql')->create('customer_sql', function (Blueprint $table) {
4 $table->id();
5 $table->uuid('guid')->unique();
6 $table->string('first_name');
7 $table->string('family_name');
8 $table->string('email');
9 $table->text('address');
10 $table->timestamps();
11 });
12}
Nosso código de migração está pronto, portanto, vamos executá-lo para criar a tabela e o índice associados ao nosso modelo do Eloquent.
php artisan migrate --path=/database/migrations/YY_MM_DD_xxxxxx_create_customer_s_q_l_s_table.php
No banco de dados MySQL, a migração criou uma tabela "customer_sql" com o esquema necessário, junto com os índices necessários. O Laravel mantém o registro de quais migrações foram executadas na tabela "migrações".
Um esquema de banco de dados SQL
A seguir, podemos modificar o código do modelo em <project>/app/Models/CustomerSQL.php para corresponder ao nosso esquema.
1// This is the standard Eloquent Model
2use Illuminate\Database\Eloquent\Model;
3class CustomerSQL extends Model
4{
5    use HasFactory;
6    // the selected database as defined in /config/database.php
7    protected $connection = 'mysql';
8    // the table as defined in the migration
9    protected $table= 'customer_sql';
10    // our selected primary key for this model
11    protected $primaryKey = 'guid';
12    //the attributes' names that match the migration's schema
13    protected $fillable = ['guid', 'first_name', 'family_name', 'email', 'address'];
14}

Modelo Eloquent do MongoDB

Vamos criar um modelo Eloquent para nosso MongoDB database chamado "CustomerMongoDB" executando este comando prompt do Laravel no diretório do projeto"
php artisan make:model CustomerMongoDB
O Laravel cria uma classeCustomerMongoDB no arquivo \models\CustomerMongoDB.php mostrado no bloco de código abaixo. Por padrão, os modelos usam a conexão de banco de dados "padrão", mas podemos especificar qual usar adicionando o nó $connection à classe. Da mesma forma, é possível especificar o nome da coleção por meio de um nó $collection.
Observe como a classe do modelo base é substituída na declaração "use". Isso é necessário para definir "_id" como a chave primária e aproveitar os recursos avançados do MongoDB, como array push/pull.
1//use Illuminate\Database\Eloquent\Model;
2 use MongoDB\Laravel\Eloquent\Model;
3
4class CustomerMongoDB extends Model
5{
6    use HasFactory;
7
8    // the selected database as defined in /config/database.php
9 protected $connection = 'mongodb';
10
11    // equivalent to $table for MySQL
12    protected $collection = 'laracoll';
13
14    // defines the schema for top-level properties (optional).
15    protected $fillable = ['guid', 'first_name', 'family_name', 'email', 'address'];
16}
A definição de classe estendida é quase idêntica à definição padrão do Laravel. Observe que $table é substituído por $collection para usar o nome do MongoDB. É isso.
Ainda podemos usar migrações Eloquent com o MongoDB (mais sobre isso abaixo), mas definir o esquema e criar uma coleção com uma migração Laravel-MongoDB é opcional devido ao esquema flexível do MongoDB. Em alto nível, cada documento em uma coleção do MongoDB pode ter um esquema diferente.
Se quisermos impor um esquema, podemos! O MongoDB possui um ótimo mecanismo de validação de esquema que funciona fornecendo um documento de validação ao criar manualmente a coleção usando db.createcollection(). Abordaremos isso em um próximo artigo.

CRUD com Eloquent

Com os modelos prontos, criar dados para um backend do MongoDB não é diferente, e é o que esperamos de um ORM.\
Abaixo, podemos comparar os endpoints da API /api/create_eloquent_mongo/ e /api/create_eloquent_sql/. O código é idêntico, exceto para os diferentes nomes de modelo CustomerMongoDB e CustomerSQL.
1Route::get('/create_eloquent_sql/', function (Request $request) {
2    $success = CustomerSQL::create([
3        'guid'=> 'cust_0000',
4        'first_name'=> 'John',
5        'family_name' => 'Doe',
6        'email' => 'j.doe@gmail.com',
7        'address' => '123 my street, my city, zip, state, country'
8    ]);
9
10    ...
11});
12
13Route::get('/create_eloquent_mongo/', function (Request $request) {
14    $success = CustomerMongoDB::create([
15        'guid'=> 'cust_1111',
16        'first_name'=> 'John',
17        'family_name' => 'Doe',
18        'email' => 'j.doe@gmail.com',          
19        'address' => '123 my street, my city, zip, state, country'
20    ]);
21
22    ...
23});
Após adicionar o documento, podemos recuperá-lo usando a função "where" do Eloquent da seguinte forma:
1Route::get('/find_eloquent/', function (Request $request) {
2    $customer = CustomerMongoDB::where('guid', 'cust_1111')->get();
3    ...
4});
O Eloquent permite que os desenvolvedores encontrem dados usando queries complexas com várias condições de correspondência, e há mais para aprender examinando o Eloquent e a extensão MongoDB Laravel. Os testes de query do Laravel MongoDB são um ótimo lugar para procurar exemplos de sintaxe adicionais e serão mantidos atualizados.
É claro que também podemos atualizar e excluir registros usando o Eloquent como mostrado no código abaixo:
1Route::get('/update_eloquent/', function (Request $request) {
2 $result = CustomerMongoDB::where('guid', 'cust_1111')->update( ['first_name' => 'Jimmy'] );
3    ...
4});
5
6Route::get('/delete_eloquent/', function (Request $request) {
7    $result = CustomerMongoDB::where('guid', 'cust_1111')->delete();
8    ...
9});
O Eloquent é uma maneira fácil de começar com o MongoDB, e as coisas funcionam de forma parecida com o esperado. Mesmo com um esquema simples, os desenvolvedores podem se beneficiar da grande escalabilidade, da alta confiabilidade dos dados e da disponibilidade do cluster com os clusters totalmente gerenciados do MongoDB e com a fragmentação.
Neste ponto, nosso serviço de back-end conectado ao MongoDB está instalado e funcionando, e este pode ser o final de um típico artigo "CRUD". No entanto, o MongoDB é capaz de muito mais, então continue lendo.

Acesse todo o potencial do MongoDB

Para extrair todo o poder do MongoDB, é melhor usar totalmente seu modelo do documento e API de query nativa.
O document model é conceitualmente como um objeto JSON, mas é baseado em BSON (uma representação binária com digitação mais refinada) e apoiado por um storage engine de alto desempenho. O documento oferece suporte a BSON types, incluindo objeto, arrays e expressões regulares. Sua API de query nativa pode acessar e processar esses dados com eficiência.

Por que o document model é ótimo?

Vamos discutir alguns benefícios do document model.

Ele reduz ou elimina junções

Documentos e arrays incorporados emparelhados com modelagem de dados permitem que os desenvolvedores evitem operações caras de "junção" de banco de dados, especialmente nas cargas de trabalho mais críticas, queries e coleções enormes. Se necessário, o MongoDB oferece suporte a operações de junção com o operador $lookup, mas o document model permite que os desenvolvedores mantenham essas operações ao mínimo ou se livrem totalmente delas. A redução de junções também facilita a fragmentação de coleções em vários servidores para aumentar a capacidade.

Reduz os custos da carga de trabalho

Essa estratégia NoSQL é fundamental para aumentar a eficiência da carga de trabalho do banco de dados e reduzir o faturamento. É por isso que a Amazon eliminou a maioria das suas cargas de trabalho de banco de dados relacional interno anos atrás. Saiba mais assistindo a Rick Houlihan, que comandou esse esforço na Amazon, contar essa história no Youtube ou leia sobre ela em nosso blog. Ele agora é CTO de campo do MongoDB para contas estratégicas.

Isso ajuda a evitar o tempo de inatividade durante as atualizações de esquema

Os documentos do MongoDB estão contidos em "coleções" (tabelas, na linguagem SQL). A grande diferença entre SQL e MongoDB é que cada documento em uma coleção pode ter um esquema diferente. Podemos armazenar esquemas completamente diferentes na mesma coleção. Isso permite estratégias como versionamento de esquema para evitar o tempo de inatividade durante as atualizações do esquema e muito mais!
A modelagem de dados vai além do escopo deste artigo, mas vale a pena dedicar 15 minutos para assistir ao vídeo Princípios de modelagem de dados para o MongoDB com Daniel Coupal, autor de MongoDB Data Modeling and Schema Design, um livro que muitos de nós do MongoDB temos em nossas mesas. No mínimo, leia este breve artigo sobre as 6 regras de ouro para esquemas do MongoDB.

CRUD com dados aninhados

A extensão Laravel MongoDB Eloquent oferece operações específicas do MongoDB para dados aninhados. No entanto, adicionar dados aninhados também é muito intuitivo sem usar os métodos embedsMany() e embedsOne() fornecidos pela extensão.
Como mostrado anteriormente, é fácil definir os atributos de esquema de nível superior com o Eloquent. No entanto, é mais difícil fazer isso ao usar arrays e documentos incorporados.
Felizmente, podemos criar intuitivamente as estruturas de dados do modelo em PHP. No exemplo abaixo, o campo "endereço" passou de uma string para um tipo de objeto. O campo 'email' passou de uma string para um tipo de array [de strings]. Arrays e objetos não são tipos suportados no MySQL.
1Route::get('/create_nested/', function (Request $request) {
2    $message = "executed";
3    $success = null;
4
5    $address = new stdClass;
6    $address->street = '123 my street name';
7    $address->city = 'my city';
8    $address->zip= '12345';
9    $emails = ['j.doe@gmail.com', 'j.doe@work.com'];
10
11    try {
12        $customer = new CustomerMongoDB();
13        $customer->guid = 'cust_2222';
14        $customer->first_name = 'John';
15        $customer->family_name= 'Doe';
16        $customer->email= $emails;
17        $customer->address= $address;
18        $success = $customer->save(); // save() returns 1 or 0
19    }
20    catch (\Exception $e) {
21        $message = $e->getMessage();
22    }
23    return ['msg' => $message, 'data' => $success];
24});
Se executarmos o ponto de extremidade da API localhost/api/create_nested/, ele criará um documento como mostra a representação JSON abaixo. Os campos de data/hora updated_at e created_at são adicionados automaticamente pelo Eloquent, e é possível desativar esse recurso do Eloquent (confira os Carimbos de data e hora na documentação oficial do Laravel).
Visualização JSON do registro de cliente recém-adicionado

Apresentando a API de query do MongoDB

O MongoDB tem uma API de query nativa otimizada para manipular e transformar dados complexos. Há também um poderoso framework de agregação do qual podemos direcionar dados de um estágio para outro, tornando intuitivo para os desenvolvedores criarem agregações muito complexas. A query nativa pode ser acessada por meio do objeto "coleção" do MongoDB.

Eloquent e "queries brutas"

O Eloquent tem uma maneira inteligente de expor todos os recursos do banco de dados subjacente usando "queries brutas", que são enviadas "como estão" para o banco de dados sem nenhum processamento do Eloquent Query Builder, expondo assim a API de query nativa. Leia sobre expressões brutas na documentação oficial do Laravel.
Podemos realizar uma query nativa bruta do MongoDB a partir do modelo da seguinte maneira, e o modelo retornará uma coleção Eloquent
1$mongodbquery = ['guid' => 'cust_1111'];
2
3// returns a "Illuminate\Database\Eloquent\Collection" Object
4$results = CustomerMongoDB::whereRaw( $mongodbquery )->get();
Também é possível obter o objeto de coleção nativa do MongoDB e realizar uma query que retornará objetos como documentos ou cursores nativos do MongoDB:
1$mongodbquery = ['guid' => 'cust_1111', ];
2
3$mongodb_native_collection = DB::connection('mongodb')->getCollection('laracoll');
4
5$document = $mongodb_native_collection->findOne( $mongodbquery );
6$cursor = $mongodb_native_collection->find( $mongodbquery );
Usar diretamente a coleção do MongoDB é o caminho certo para acessar todos os recursos do MongoDB. Normalmente, as pessoas começam a usar o arquivo nativo collection.insert(), collection.find() e collection.update() primeiro.
As funções comuns da API de query do MongoDB funcionam usando uma lógica semelhante e exigem condições correspondentes para identificar documentos para seleção ou exclusão. Uma projeção opcional define quais campos queremos nos resultados.
Com o Laravel, há várias maneiras de consultar dados, e o ponto de extremidade da API /find_native/ abaixo mostra como usar whereRaw(). Além disso, podemos usar os métodos de coleção findOne() e find() do MongoDB, que retornam um documento e um cursor, respectivamente.
1/*
2 Find records using a native MongoDB Query
3 1 - with Model->whereRaw()
4 2 - with native Collection->findOne()
5 3 - with native Collection->find()
6*/
7
8Route::get('/find_native/', function (Request $request) {
9    // a simple MongoDB query that looks for a customer based on the guid
10    $mongodbquery = ['guid' => 'cust_2222'];
11
12    // Option #1
13    //==========
14    // use Eloquent's whereRaw() function. This is the easiest way to stay close to the Laravel paradigm
15    // returns a "Illuminate\Database\Eloquent\Collection" Object
16
17    $results = CustomerMongoDB::whereRaw( $mongodbquery )->get();
18
19    // Option #2 & #3
20    //===============
21    // use the native MongoDB driver Collection object. with it, you can use the native MongoDB Query API
22    $mdb_collection = DB::connection('mongodb')->getCollection('laracoll');
23
24    // find the first document that matches the query
25    $mdb_bsondoc= $mdb_collection->findOne( $mongodbquery ); // returns a "MongoDB\Model\BSONDocument" Object
26
27    // if we want to convert the MongoDB Document to a Laravel Model, use the Model's newFromBuilder() method
28    $cust= new CustomerMongoDB();
29    $one_doc = $cust->newFromBuilder((array) $mdb_bsondoc);
30
31    // find all documents that matches the query
32    // Note: we're using find without any arguments, so ALL documents will be returned
33
34    $mdb_cursor = $mdb_collection->find( ); // returns a "MongoDB\Driver\Cursor" object
35    $cust_array = array();
36    foreach ($mdb_cursor->toArray() as $bson) {
37        $cust_array[] = $cust->newFromBuilder( $bson );
38    }
39
40    return ['msg' => 'executed', 'whereraw' => $results, 'document' => $one_doc, 'cursor_array' => $cust_array];
41});
A atualização de documentos é feita fornecendo uma lista de atualizações, além dos critérios correspondentes. Aqui está um exemplo usando updateOne(), mas updateMany() funciona da mesma forma. updateOne() retorna um documento que contém informações sobre quantos documentos foram correspondidos e quantos foram realmente modificados.
1/*
2 Update a record using a native MongoDB Query
3*/
4Route::get('/update_native/', function (Request $request) {
5    $mdb_collection = DB::connection('mongodb')->getCollection('laracoll');
6    $match = ['guid' => 'cust_2222'];
7    $update = ['$set' => ['first_name' => 'Henry', 'address.street' => '777 new street name'] ];
8    $result = $mdb_collection->updateOne($match, $update );
9    return ['msg' => 'executed', 'matched_docs' => $result->getMatchedCount(), 'modified_docs' => $result->getModifiedCount()];
10});
Excluir documentos é tão fácil quanto localizá-los. Novamente, há um critério correspondente e a API retorna um documento indicando o número de documentos excluídos.
1Route::get('/delete_native/', function (Request $request) {
2    $mdb_collection = DB::connection('mongodb')->getCollection('laracoll');
3    $match = ['guid' => 'cust_2222'];
4    $result = $mdb_collection->deleteOne($match );
5    return ['msg' => 'executed', 'deleted_docs' => $result->getDeletedCount() ];
6});

Pipeline de agregação

Como agora temos acesso à API nativa do MongoDB, vamos apresentar o pipeline de agregação. Um pipeline de agregação é uma tarefa no framework de agregação do MongoDB. Os desenvolvedores usam o framework de agregação para executar várias tarefas, desde painéis de controle em tempo real até a análise de "big data".
Nós provavelmente o usaremos para consultar, filtrar e classificar dados em um primeiro momento. A introdução às agregações do livro online gratuito Practical MongoDB Aggregations, de Paul Downe, fornece uma boa visão geral do que pode ser feito com ele.
Um pipeline de agregação consiste em vários estágios onde a saída de cada estágio é a entrada do próximo, como o encadeamento no Unix.
Usaremos o banco de dados de amostra "sample_mflix" que deveria ter sido carregado ao criar nosso cluster do Atlas. O Laravel nos permite acessar vários bancos de dados MongoDB no mesmo aplicativo, portanto, vamos adicionar o banco de dados sample_mflix (a database.php):
1'mongodb_mflix' => [
2            'driver' => 'mongodb',
3            'dsn' => env('DB_URI'),
4            'database' => 'sample_mflix',
5        ],
Em seguida, podemos criar um ponto de extremidade API /aggregate/ e definir um pipeline de agregação de três estágios para buscar dados da coleção "filmes", calcular a classificação média de filmes por gênero e retornar uma lista. Mais detalhes sobre a agregação de classificações de filmes.
1Route::get('/aggregate/', function (Request $request) {
2    $mdb_collection = DB::connection('mongodb_mflix')->getCollection('movies');
3
4    $stage0 = ['$unwind' => ['path' => '$genres']];
5    $stage1 = ['$group' => ['_id' => '$genres', 'averageGenreRating' => ['$avg' => '$imdb.rating']]];
6    $stage2 = ['$sort' => ['averageGenreRating' => -1]];
7
8    $aggregation = [$stage0, $stage1, $stage2];
9    $mdb_cursor = $mdb_collection->aggregate( $aggregation );
10    return ['msg' => 'executed', 'data' => $mdb_cursor->toArray() ];
11});
Isso mostra como é fácil compor vários estágios para agrupar, calcular, transformar e classificar dados. Esse é o método preferido para realizar operações de agregação, sendo possível até gerar um documento, que é usado posteriormente pelo método updateOne(). Há todo um curso de agregação.

Não se esqueça de indexar

Agora sabemos como realizar operações CRUD, queries nativas e agregações. No entanto, não se trata de indexar para aumentar o desempenho. As estratégias de indexação e as melhores práticas do MongoDB estão além do escopo deste artigo, mas vamos ver como podemos criar índices.

Opção 1: criar índices com as migrações do Eloquent

Primeiro, podemos usar as migrações do Eloquent. Embora pudéssemos dispensá-las por termos um esquema flexível, elas poderiam ser um recipiente para armazenar modos de criação e definição de índices.
Como não usamos a opção --migration ao criar o modelo, sempre podemos criar a migração mais tarde. Nesse caso, podemos executar este comando:
php artisan make:migration create_customer_mongo_db_table
Ele criará uma migração localizada em <project>/database/migrations/YYYY_MM_DD_xxxxxx_create_customer_mongo_db_table.php.
Podemos atualizar o código da nossa função up() para criar um índice para a nossa coleção. Por exemplo, criaremos um índice para nosso campo "guid" e o tornaremos uma restrição exclusiva. Por padrão, o MongoDB sempre tem um campo de chave primária _id inicializado com um ObjectId por padrão. Podemos fornecer nosso próprio identificador exclusivo no lugar do ObjectId padrão do MongoDB.
1public function up() {
2 Schema::connection('mongodb')->create('laracoll', function ($collection) {
3 $collection->unique('guid'); // Ensure the guid is unique since it will be used as a primary key.
4 });
5}
Como anteriormente, essa função de migração up() pode ser executada usando o comando:
php artisan migrate --path=/database/migrations/2023_08_09_051124_create_customer_mongo_db_table.php
Se a coleção "laracoll" não existir, ela será criada e um índice será criado para o campo "guid". Na GUI do Atlas, ele tem a seguinte aparência:
guid_1 index listado no MongoDB Atlas

Opção nº 2: criar índices com a API nativa do MongoDB

A segunda opção é usar a função nativa createIndex() do MongoDB, que pode ter novas opções ainda não cobertas pelo pacote Laravel MongoDB. Aqui está um exemplo simples que cria um índice com o campo "guid" como a restrição exclusiva.
1Route::get('/create_index/', function (Request $request) {
2
3    $indexKeys = ["guid" => 1];
4    $indexOptions = ["unique" => true];
5    $result = DB::connection('mongodb')->getCollection('laracoll')->createIndex($indexKeys, $indexOptions);
6
7    return ['msg' => 'executed', 'data' => $result ];
8});

Opção nº 3: criar índices com a GUI do Atlas

Por fim, também podemos criar um índice na interface web do Atlas GUI, usando um construtor visual ou a partir de JSON. A interface GUI é útil para experimentar. O mesmo vale para o MongoDB Compass, nosso aplicativo MongoDB GUI.
Criação de índice a partir da GUI do MongoDB Atlas

Conclusão

Este artigo abordou a criação de um serviço de backend com PHP/Laravel, com base no MongoDB, para um aplicativo da web de frontend. Vimos como é fácil para os desenvolvedores do Laravel aproveitar suas habilidades existentes com um backend do MongoDB.
Ele também mostrou por que o document model, associado a uma boa modelagem de dados, leva a uma maior eficiência e escalabilidade do banco de dados. Podemos usá-lo totalmente com a API de query nativa do MongoDB para liberar todo o poder do MongoDB para criar aplicativos melhores com menos tempo de inatividade.
Saiba mais sobre a sintaxe da extensão Laravel MongoDB consultando a documentação oficial e os testes de exemplo do repositório no GitHub. Para obter exemplos simples do MongoDB em PHP, consulte os testes de exemplo de nossa biblioteca PHP.
Considere fazer o Caminho de modelagem de MongoDB do MongoDB University ou o curso geral PHP/ MongoDB, embora ele não seja específico para o Laravel.
Criaremos mais conteúdo PHP/Laravel, então inscreva-se em nossos vários canais, incluindo YouTube e LinkedIn. Por fim, participe dos fóruns oficiais da comunidade! Há uma tag PHP onde outros desenvolvedores e engenheiros MongoDB discutem todos os dados e PHP.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Notícias e anúncios

Laravel Herd adiciona suporte nativo ao MongoDB


Oct 07, 2024 | 0 min read
Podcast

Explorando o driver PHP com Jeremy Mikola - Episódio de podcast


Aug 28, 2024 | 29 min
Início rápido

Preparando-se para executar PHP com MongoDB


Aug 29, 2024 | 12 min read
Início rápido

Criar, ler, atualizar e excluir documentos MongoDB com PHP


Sep 11, 2024 | 8 min read
Sumário