Operações com construtores
Visão geral
Neste guia, você aprenderá sobre as classes de construtor que a biblioteca PHP fornece para criar os tipos usados em suas operações. Você pode usar as classes de construtor e os métodos de fábrica do recurso Construtor de Agregações para criar filtros para outras operações, como operações de localização, atualização e exclusão. Para saber mais sobre o Construtor de Agregações, consulte a seção Construtor de Agregações do guia Agregação.
Usar construtores para criar queries ajuda a identificar erros no tempo de compilação e evitá-los no tempo de execução. Este guia fornece informações sobre classes de construtores que você pode usar para executar as seguintes tarefas:
Observação
Definindo opções de operação
Você não pode especificar opções usando métodos de fábrica para os estágios de agregação equivalentes. Por exemplo, você não pode usar o método Stage::limit()
para definir um limite de documentos retornados em sua operação de localização. Você deve especificar opções usando a sintaxe baseada em string , como mostrado no seguinte código:
$options = [ 'limit' => 5, '<option name>' => '<specification>', ];
Este guia fornece exemplos de como usar construtores em operações não de agregação. Para visualizar exemplos de agregação, consulte o guia Transforme seus dados com agregação.
Dados de amostra
Os exemplos neste guia usam a collection shipwrecks
no banco de dados sample_geospatial
dos conjuntos de banco de dados de amostra do Atlas. Para acessar essa coleção a partir do seu aplicação PHP , instancie um MongoDB\Client
que se conecte a um Atlas cluster e atribua o seguinte valor à sua variável $collection
:
$collection = $client->sample_geospatial->shipwrecks;
Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Importar classes de construtor
Para executar os exemplos deste guia, você deve importar as seguintes classes para seu aplicação:
use MongoDB\Builder\Pipeline; use MongoDB\Builder\Query; use MongoDB\Builder\Stage;
Criar um filtro
Você pode utilizar métodos de fábrica da classe de construtor Query
para criar definições de filtro para utilizar em localizar, atualizar e excluir operações. Ao usar o método de fábrica Query::query()
para criar queries, você pode usar a sintaxe de argumentos nomeados e implementar a segurança de tipos. Para saber mais sobre como criar filtros, consulte o guia Especificar uma consulta.
As etapas a seguir descrevem como criar uma definição de filtro usando construtores:
Chame o método
Query::query()
para criar uma query.Passe o nome do campo para filtrar e um método de fábrica da classe
Query
. Você pode passar um ou mais pares de nomes de campo e critérios no filtro para aplicar várias cláusulas.
O código a seguir mostra o modelo para criar uma definição de filtro usando construtores:
$filter = Query::query( <field name>: Query::<factory method>(<parameters>), <field name>: Query::<factory method>(<parameters>), ... );
Para combinar critérios de query usando operadores de query lógica ($and
, $or
, $not
, $nor
), você pode usar o seguinte modelo de query:
$filter = Query::<logical operator>( Query::query(<field name>: Query::<factory method>(<parameters>)), Query::query(<field name>: Query::<factory method>(<parameters>)), ... );
Para saber mais, consulte Operadores de query lógica no manual do MongoDB Server.
As seções a seguir fornecem exemplos que usam construtores para criar definições de filtro para diferentes operações.
Exemplo de recuperação
Este exemplo executa as seguintes ações:
Usa o método de fábrica
Query::eq()
para corresponder a documentos nos quais o valor de campofeature_type
é'Wrecks - Visible'
Usa o método de fábrica
Query::near()
para corresponder a documentos nos quais o campo de localizaçãocoordinates
está a menos de10000
metros das coordenadas especificadasChama o método
MongoDB\Collection::find()
para recuperar os documentos correspondentesImprime os documentos correspondentes
// Creates a query filter by using builders and // retrieves matching documents $docs = $collection->find( Query::query( feature_type: Query::eq('Wrecks - Visible'), coordinates: Query::near( Query::geometry( type: 'Point', coordinates: [-79.9, 9.3], ), maxDistance: 10000, ) ) ); // Prints matching documents foreach ($docs as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":...,"feature_type":"Wrecks - Visible","coordinates":[-79.9137115,9.3390503],...} {"_id":...,"feature_type":"Wrecks - Visible","coordinates":[-79.9357223,9.3340302],...} {"_id":...,"feature_type":"Wrecks - Visible","coordinates":[-79.9081268,9.3547792],...} // Results truncated
Para saber mais sobre como encontrar operações, consulte o guia Recuperar dados .
Excluir exemplo
Este exemplo executa as seguintes ações:
Usa o método de fábrica
Query::or()
para combinar documentos que atendam a uma das seguintes cláusulas de query:Cláusula que usa o método de fábrica
Query::regex()
para verificar se o valor do campofeature_type
contém a string'nondangerous'
Cláusula que usa o método de fábrica
Query::gt()
para verificar se o valor do campodepth
é maior que10.0
Chama o método
MongoDB\Collection::deleteOne()
para excluir o primeiro documento correspondenteImprime o número de documentos excluídos
// Creates a query filter by using builders // and deletes the first matching document $result = $collection->deleteOne( Query::or( Query::query(feature_type: Query::regex('nondangerous$', '')), Query::query(depth: Query::gt(10.0)), ) ); // Prints number of deleted documents echo 'Deleted documents: ', $result->getDeletedCount(), PHP_EOL;
Deleted documents: 1
Para saber mais sobre como excluir operações, consulte o guia Excluir documentos .
Definir um documento de atualização
Você pode utilizar métodos de fábrica da classe de construtor Stage
para criar documentos de atualização. Atualizar documentos descreve as atualizações a serem feitas nos documentos de destino. Para saber mais sobre como atualizar documentos, consulte o guia Atualizar documentos.
As etapas a seguir descrevem como criar um documento de atualização usando construtores:
Crie uma instância
Pipeline
.Passe um ou mais estágios chamando métodos da classe
Stage
, comoStage::set()
, e passando nomes e valores de campo .
O código a seguir mostra o modelo para definir uma atualização usando construtores:
$update = new Pipeline( Stage::set(<field name>: <value>), Stage::set(<field name>: <value>), ... );
Este exemplo executa as seguintes ações:
Usa o método de fábrica
Query::eq()
para corresponder a documentos nos quais o valor de campowatlev
é'partly submerged at high water'
Utiliza o método
Stage::set()
para definir o campoyear
como1870
Chama o método
MongoDB\Collection::updateOne()
para executar a atualizaçãoImprime o número de documentos atualizados
// Creates a query filter and an update document by // using builders and updates the first matching document $result = $collection->updateOne( Query::query(watlev: Query::eq('partly submerged at high water')), new Pipeline( Stage::set(year: 1870), ), ); // Prints number of updated documents echo 'Updated documents: ', $result->getModifiedCount(), PHP_EOL;
Updated documents: 1
Modificar o resultado do change stream
Você pode usar métodos de fábrica da classe Stage
para modificar a saída de um fluxo de alteração criando um pipeline. Para saber mais sobre change streams, consulte o guia Monitorar alterações de dados.
As etapas a seguir descrevem como criar um filtro de fluxo de alteração usando construtores:
Crie uma matriz.
Passe um ou mais
$match
estágios chamando os métodos de fábrica da classeStage
e os parâmetros exigidos.
O código a seguir mostra o modelo para modificar a saída do change stream usando construtores:
$pipeline = [ Stage::<factory method>(...), Stage::<factory method>(...), ... ];
Você pode passar esse pipeline para os seguintes métodos:
Este exemplo executa as seguintes ações:
Usa o método
Stage::match()
para filtrar apenas eventos de alteração para operações de atualizaçãoUtiliza o método
Stage::project()
para produzir apenas os camposoperationType
,ns
(namespace) efullDocument
Chama o método
MongoDB\Collection::watch()
para abrir o fluxo de alterações e define a opçãofullDocument
para gerar o documento completo após a atualizaçãoImpressões alteram eventos à medida que eles ocorrem
// Creates a pipeline to filter for update operations and return // only specific fields $pipeline = [ Stage::match(operationType: Query::eq('update')), Stage::project(operationType: 1, ns: 1, fullDocument: 1), ]; // Opens the change stream $changeStream = $collection->watch( $pipeline, ['fullDocument' => MongoDB\Operation\Watch::FULL_DOCUMENT_UPDATE_LOOKUP] ); // Prints change events based on the pipeline specifications for ($changeStream->rewind(); true; $changeStream->next()) { if (! $changeStream->valid()) { continue; } $event = $changeStream->current(); echo json_encode($event), PHP_EOL; if ($event['operationType'] === 'invalidate') { break; } }
{ "_id":..., "operationType":"update", "fullDocument":{"_id":...,"feature_type":"Wrecks - Visible",...}, "ns":{"db":"sample_geospatial","coll":"shipwrecks"} }
Para saber mais sobre as informações fornecidas por eventos de alteração, consulte Eventos de alteração no manual do MongoDB Server.