Visão geral
Laravel fornece uma máscara para acessar a classe de construtor de esquema Schema
, que permite criar e modificar tabelas, ou collections no MongoDB. As facetas são interfaces estáticas para classes que tornam a sintaxe mais concisa e melhoram a testabilidade.
A Integração Laravel suporta um subconjunto dos métodos de gerenciamento de índice e coleção na façada Laravel Schema
.
Para saber mais sobre facetas, consulte Facades na documentação do Laravel.
As seções a seguir descrevem os recursos do construtor de esquema Laravel disponíveis na Integração Laravel e mostram exemplos de como usá-los:
Realizar migrações do Laravel
As migrações do Schema
permitem criar, modificar e excluir programaticamente seu esquema de banco de dados executando métodos incluídos na face . As seções a seguir explicam como criar uma classe de migração quando você usa um banco de MongoDB database e como executá-las.
A modificação de bancos de dados e collections a partir de uma migração fornece uma abordagem controlada que garante consistência, controle de versão e reversibilidade em seu aplicativo.
Criar uma classe de migração
Você pode criar classes de migração manualmente ou gerá-las usando o comando php artisan make:migration
. Se você gerá-los, deverá fazer as seguintes alterações para executar as alterações de esquema em seu banco de MongoDB database:
Substitua a importação
Illuminate\Database\Schema\Blueprint
porMongoDB\Laravel\Schema\Blueprint
se ela for referenciada em sua migraçãoUse apenas comandos e sintaxe suportados pela integração Laravel
Dica
Se sua conexão de banco de dados padrão não estiver definida como banco de MongoDB database, atualize a seguinte configuração para garantir que a migração especifique o banco de dados correto:
Certifique-se de que o item da matriz
connections
contém uma entradamongodb
válida no arquivoconfig/database.php
Especifique
"mongodb"
no campo$connection
da sua classe de migração
O exemplo de classe de migração a seguir contém os seguintes métodos:
up()
, que cria uma collection e um índice quando você executa a migraçãodown()
, que descarta a coleção e todos os índices quando você reverte a migração
declare(strict_types=1); use Illuminate\Database\Migrations\Migration; use Illuminate\Support\Facades\Schema; use MongoDB\Laravel\Schema\Blueprint; return new class extends Migration { protected $connection = 'mongodb'; /** * Run the migrations. */ public function up(): void { Schema::create('astronauts', function (Blueprint $collection) { $collection->index('name'); }); } /** * Reverse the migrations. */ public function down(): void { Schema::drop('astronauts'); } };
Executar ou Reverter uma Migração
Para executar a migração do banco de dados de um arquivo de classe, execute o seguinte comando após substituir o espaço reservado:
php artisan migrate --path=<path to your migration class file>
Este comando executa a função up()
no arquivo de classe para criar a coleção e índice no banco de dados especificado no arquivo config/database.php
.
Para reverter a migração, execute o seguinte comando depois de substituir o espaço reservado:
php artisan migrate:rollback --path=<path to your migration class file>
Este comando executa a função down()
no arquivo de classe para soltar a coleção e índices relacionados.
Para saber mais sobre migrações do Laravel, consulte Banco de Dados: Migrações na documentação do Laravel.
Implementar validação de esquema
A partir da integração do Laravel v5.5, você pode usar o método jsonSchema()
para implementar validação de esquema ao usar os seguintes métodos de construtor de esquema:
Schema::create()
: Ao criar uma nova collectionSchema::table()
: Ao atualizar as propriedades da coleção
Você pode usar a validação de esquema para restringir tipos de dados e intervalos de valores de campos de documento em uma coleção especificada. Depois de implementar a validação de esquema, o servidor restringe as operações de gravação que não seguem as regras de validação.
Você pode passar os seguintes parâmetros para jsonSchema()
:
schema
: Array que especifica as regras de validação para a coleção. Para saber mais sobre a construção de um esquema, consulte a referência $jsonSchema no manual do servidor.validationLevel
: define o nível da imposição de validação. Os valores aceitos são"strict"
(padrão) e"moderate"
.validationAction
: especifica a ação a ser tomada quando são tentadas operações inválidas. Os valores aceitos são"error"
(padrão) e"warn"
.
Este exemplo demonstra como especificar um esquema no método jsonSchema()
ao criar uma coleção. A validação de esquema tem as seguintes especificações:
Os documentos na collection
pilots
devem conter o campolicense_number
.O campo
license_number
deve ter um valor inteiro entre1000
e9999
.Se você tentar executar operações de gravação inválidas, o servidor gerará um erro.
Schema::create('pilots', function (Blueprint $collection) { $collection->jsonSchema( schema: [ 'bsonType' => 'object', 'required' => ['license_number'], 'properties' => [ 'license_number' => [ 'bsonType' => 'int', 'minimum' => 1000, 'maximum' => 9999, ], ], ], validationAction: 'error', ); });
Se você tentar inserir um documento na coleção pilots
que viole a regra de validação de esquema, o Laravel MongoDB retornará uma BulkWriteException.
Verifique se existe uma coleção
Para verificar se uma coleção existe, chame o método hasCollection()
na face Schema
em seu arquivo de migração. Você pode usar isso para executar a lógica de migração condicionalmente.
O seguinte exemplo de migração cria uma collection telescopes
se uma collection denominada stars
existir:
$hasCollection = Schema::hasCollection('stars'); if ($hasCollection) { Schema::create('telescopes'); }
Gerenciar índices
Os índices do MongoDB são estruturas de dados que melhoram a eficiência da query reduzindo o número de documentos necessários para recuperar os resultados da query. Alguns índices, como índices geoespaciais, estendem como você pode consultar os dados.
Para melhorar o desempenho da consulta usando um índice, verifique se o índice cobre a consulta. Para saber mais sobre índices e otimização de queries, consulte as seguintes entradas de manual do servidor MongoDB:
As seções a seguir mostram como você pode usar o construtor de esquemas para criar e eliminar vários tipos de índices em uma coleção.
Crie um índice
Para criar índices, execute as seguintes ações:
Ligue para o método
create()
na faceSchema
em seu arquivo de migração.Passe o nome da collection e um método de chamada de resposta com um parâmetro
MongoDB\Laravel\Schema\Blueprint
.Especifique os detalhes de criação do índice na instância do
Blueprint
.
O exemplo de migração a seguir cria índices nos seguintes campos de coleção:
Índice de campo único ativado
mission_type
Índice composto em
launch_location
elaunch_date
, especificando uma ordem de classificação decrescente emlaunch_date
Índice único no campo
mission_id
, especificando o nome do índice"unique_mission_id_idx"
Clique no botão VIEW OUTPUT para ver os índices criados pela execução da migração, incluindo o índice padrão no campo _id
:
Schema::create('flights', function (Blueprint $collection) { $collection->index('mission_type'); $collection->index(['launch_location' => 1, 'launch_date' => -1]); $collection->unique('mission_id', options: ['name' => 'unique_mission_id_idx']); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { mission_type: 1 }, name: 'mission_type_1' }, { v: 2, key: { launch_location: 1, launch_date: -1 }, name: 'launch_location_1_launch_date_-1' }, { v: 2, key: { mission_id: 1 }, name: 'unique_mission_id_idx', unique: true } ]
Especificar opções de índice
As opções de índice do MongoDB determinam como os índices são usados e armazenados. Você pode especificar opções de índice ao chamar um método de criação de índice, como index()
, em uma instância Blueprint
.
O código de migração a seguir mostra como adicionar um agrupamento a um índice como uma opção de índice. Clique no botão VIEW OUTPUT para ver os índices criados pela execução da migração, incluindo o índice padrão no campo _id
:
Schema::create('passengers', function (Blueprint $collection) { $collection->index( 'last_name', name: 'passengers_collation_idx', options: [ 'collation' => [ 'locale' => 'de@collation=phonebook', 'numericOrdering' => true ], ], ); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { last_name: 1 }, name: 'passengers_collation_idx', collation: { locale: 'de@collation=phonebook', caseLevel: false, caseFirst: 'off', strength: 3, numericOrdering: true, alternate: 'non-ignorable', maxVariable: 'punct', normalization: false, backwards: false, version: '57.1' } } ]
Para saber mais sobre as opções de índice, consulte Opções para todos os tipos de índice no manual do servidor MongoDB.
Criar índices esparsos, TTL e únicos
Você pode usar os métodos assistente do Laravel MongoDB para criar os seguintes tipos de índices:
Índices esparsos, que permitem entradas de índice somente para documentos que contêm o campo especificado
Índices de vida útil (TTL), que expiram após um período de tempo definido
Índices únicos, que impedem a inserção de documentos que contêm valores duplicados para o campo indexado
Para criar esses tipos de índice, execute as seguintes ações:
Ligue para o método
create()
na faceSchema
em seu arquivo de migração.Passe para
create()
o nome da collection e um método de chamada de resposta com um parâmetroMongoDB\Laravel\Schema\Blueprint
.Chame o método assistente apropriado para o tipo de índice na instância
Blueprint
e passe os detalhes da criação do índice.
O código de migração a seguir mostra como criar um índice esparso e um índice TTL usando os auxiliares de índice. Clique no botão VIEW OUTPUT para ver os índices criados pela execução da migração, incluindo o índice padrão no campo _id
:
Schema::create('planets', function (Blueprint $collection) { $collection->sparse('rings'); $collection->expire('last_visible_dt', 86400); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { rings: 1 }, name: 'rings_1', sparse: true }, { v: 2, key: { last_visible_dt: 1 }, name: 'last_visible_dt_1', expireAfterSeconds: 86400 } ]
Você pode especificar índices esparsos, TTL e únicos em um único campo ou índice composto especificando-os nas opções de índice.
O seguinte código de migração mostra como criar todos os três tipos de índices em um único campo. Clique no botão VIEW OUTPUT para ver os índices criados pela execução da migração, incluindo o índice padrão no campo _id
:
Schema::create('planet_systems', function (Blueprint $collection) { $collection->index('last_visible_dt', options: ['sparse' => true, 'expireAfterSeconds' => 3600, 'unique' => true]); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { last_visible_dt: 1 }, name: 'last_visible_dt_1', unique: true, sparse: true, expireAfterSeconds: 3600 } ]
Para saber mais sobre esses índices, consulte Propriedades do índice no manual do servidor MongoDB.
Criar um índice geoespacial
No MongoDB, os índices geoespaciais permitem consultar dados de coordenadas geoespaciais para inclusão, interseção e proximidade.
Para criar índices geoespaciais, execute as seguintes ações:
Ligue para o método
create()
na faceSchema
em seu arquivo de migração.Passe para
create()
o nome da collection e um método de chamada de resposta com um parâmetroMongoDB\Laravel\Schema\Blueprint
.Especifique os detalhes de criação do índice geoespacial na instância do
Blueprint
.
A seguinte migração de exemplo cria um índice geoespacial 2d
e 2dsphere
na coleção spaceports
. Clique no botão VIEW OUTPUT para ver os índices criados pela execução da migração, incluindo o índice padrão no campo _id
:
Schema::create('spaceports', function (Blueprint $collection) { $collection->geospatial('launchpad_location', '2dsphere'); $collection->geospatial('runway_location', '2d'); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { launchpad_location: '2dsphere' }, name: 'launchpad_location_2dsphere', '2dsphereIndexVersion': 3 }, { v: 2, key: { runway_location: '2d' }, name: 'runway_location_2d' } ]
Para saber mais sobre índices geoespaciais, consulte Índices geoespaciais no manual do servidor.
Descarte um índice
Para descartar índices de uma coleção, execute as seguintes ações:
Ligue para o método
table()
na faceSchema
em seu arquivo de migração.Passe o nome da tabela e um método de chamada de resposta com um parâmetro
MongoDB\Laravel\Schema\Blueprint
.Chame o método
dropIndex()
com o nome do índice na instânciaBlueprint
.
Observação
Se você descartar uma collection, o MongoDB descartará automaticamente todos os índices associados a ela.
O exemplo de migração a seguir elimina um índice chamado unique_mission_id_idx
da coleção flights
:
Schema::table('flights', function (Blueprint $collection) { $collection->dropIndex('unique_mission_id_idx'); });
Gerencie índices do Atlas Search e Vector Search
No MongoDB, os índices do Atlas Search oferecem suporte às suas queries de texto completo. Os índices doAtlas Vector Search suportam pesquisas de similaridade que comparam vetores de query para incorporações vetoriais em seus documentos.
Consulte os seguintes guias para saber mais sobre os recursos Atlas Search e Atlas Vector Search :
Atlas Search guide
Guia do Atlas Vector Search
Atlas Search
Para criar índices do Atlas Search , execute as seguintes ações:
Ligue para o método
create()
na faceSchema
em seu arquivo de migração.Passe para
create()
o nome da collection e um método de chamada de resposta com um parâmetroMongoDB\Laravel\Schema\Blueprint
.Passe os detalhes de criação do índice do Atlas para o método
searchIndex()
na instância doBlueprint
.
Esta migração de exemplo cria os seguintes índices do Atlas Search na coleção galaxies
:
dynamic_index
: Cria mapeamentos dinâmicosauto_index
: Suporta queries de preenchimento automático no camponame
Clique no botão VIEW OUTPUT para ver os índices de pesquisa criados pela execução da migração:
Schema::create('galaxies', function (Blueprint $collection) { $collection->searchIndex([ 'mappings' => [ 'dynamic' => true, ], ], 'dynamic_index'); $collection->searchIndex([ 'mappings' => [ 'fields' => [ 'name' => [ ['type' => 'string', 'analyzer' => 'lucene.english'], ['type' => 'autocomplete', 'analyzer' => 'lucene.english'], ['type' => 'token'], ], ], ], ], 'auto_index'); });
{ "id": "...", "name": "dynamic_index", "type": "search", "status": "READY", "queryable": true, "latestDefinition": { "mappings": { "dynamic": true } }, ... } { "id": "...", "name": "auto_index", "type": "search", "status": "READY", "queryable": true, "latestDefinition": { "mappings": { "fields": { "name": [ { "type": "string", "analyzer": "lucene.english" }, { "type": "autocomplete", "analyzer": "lucene.english" }, { "type": "token" } ] } } }, ... }
Vector Search
Para criar índices do Atlas Vector Search , execute as seguintes ações:
Ligue para o método
create()
na faceSchema
em seu arquivo de migração.Passe para
create()
o nome da collection e um método de chamada de resposta com um parâmetroMongoDB\Laravel\Schema\Blueprint
.Passe os detalhes de criação do índice vetorial para o método
vectorSearchIndex()
na instânciaBlueprint
.
A migração de exemplo a seguir cria um índice do Atlas Vector Search chamado vs_index
na coleção galaxies
.
Clique no botão VIEW OUTPUT para ver os índices de pesquisa criados pela execução da migração:
Schema::create('galaxies', function (Blueprint $collection) { $collection->vectorSearchIndex([ 'fields' => [ [ 'type' => 'vector', 'numDimensions' => 4, 'path' => 'embeddings', 'similarity' => 'cosine', ], ], ], 'vs_index'); });
{ "id": "...", "name": "vs_index", "type": "vectorSearch", "status": "READY", "queryable": true, "latestDefinition": { "fields": [ { "type": "vector", "numDimensions": 4, "path": "embeddings", "similarity": "cosine" } ] }, ... }
Eliminar um Índice de Pesquisa
Para eliminar um índice do Atlas Search ou Atlas Vector Search de uma coleção, execute as seguintes ações:
Ligue para o método
table()
na faceSchema
em seu arquivo de migração.Passe o nome da collection e um método de chamada de resposta com um parâmetro
MongoDB\Laravel\Schema\Blueprint
.Chame o método
dropSearchIndex()
com o nome do índice de pesquisa na instânciaBlueprint
.
O exemplo de migração a seguir elimina um índice chamado auto_index
da coleção galaxies
:
Schema::table('galaxies', function (Blueprint $collection) { $collection->dropSearchIndex('auto_index'); });