Docs Menu
Docs Home
/ /

Constructor de esquema

Laravel proporciona una fachada para acceder a la clase generadora de esquemas Schema, que permite crear y modificar tablas o colecciones en MongoDB. Las fachadas son interfaces estáticas para clases que simplifican la sintaxis y mejoran la capacidad de prueba.

La integración de Laravel admite un subconjunto de los métodos de gestión de colecciones e índices en la fachada Schema de Laravel.

Para obtener más información sobre las fachadas, consulte Fachadas en la documentación de Laravel.

Las siguientes secciones describen las características del generador de esquemas de Laravel disponibles en la integración de Laravel y muestran ejemplos de cómo usarlas:

Las migraciones de Laravel permiten crear, modificar y eliminar el esquema de la base de datos mediante programación mediante la ejecución de métodos incluidos en la fachada Schema. Las siguientes secciones explican cómo crear una clase de migración cuando se usa una base de datos MongoDB y cómo ejecutarla.

La modificación de bases de datos y colecciones desde una migración proporciona un enfoque controlado que garantiza la coherencia, el control de versiones y la reversibilidad en su aplicación.

Puede crear clases de migración manualmente o generarlas mediante el comando php artisan make:migration. Si las genera, debe realizar los siguientes cambios para implementar los cambios de esquema en su base de datos MongoDB:

  • Reemplace la importación Illuminate\Database\Schema\Blueprint con MongoDB\Laravel\Schema\Blueprint si se hace referencia a ella en su migración

  • Utilice únicamente comandos y sintaxis compatibles con la integración de Laravel

Tip

Si la conexión por defecto de tu base de datos está configurada en algo distinto de tu base de datos MongoDB, actualiza la siguiente configuración para asegurarte de que la migración especifique la base de datos correcta:

  • Asegúrese de que su elemento de matriz connections contenga una entrada mongodb válida en su archivo config/database.php

  • Especifique "mongodb" en el campo $connection de su clase de migración

La siguiente clase de migración de ejemplo contiene los siguientes métodos:

  • up(), que crea una colección y un índice cuando se ejecuta la migración

  • down(), que elimina la colección y todos los índices que contiene cuando se revierte la migración

<?php
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');
}
};

Para ejecutar la migración de la base de datos desde un archivo de clase, ejecuta el siguiente comando después de substituir el marcador de posición:

php artisan migrate --path=<path to your migration class file>

Este comando ejecuta la función up() en el archivo de clase para crear la colección y el índice en la base de datos especificada en el archivo config/database.php.

Para revertir la migración, ejecute el siguiente comando después de reemplazar el marcador de posición:

php artisan migrate:rollback --path=<path to your migration class file>

Este comando ejecuta la función down() en el archivo de clase para eliminar la colección y los índices relacionados.

Para obtener más información sobre las migraciones de Laravel, consulte Base de datos: Migraciones en la documentación de Laravel.

A partir de Laravel Integration v,5.5 puede usar el jsonSchema() método para implementar la validación del esquema al usar los siguientes métodos de generación de esquemas:

  • Schema::create():Al crear una nueva colección

  • Schema::table():Al actualizar las propiedades de la colección

Puede usar la validación de esquema para restringir los tipos de datos y los rangos de valores de los campos de documento en una colección específica. Tras implementar la validación de esquema, el servidor restringe las operaciones de escritura que no siguen las reglas de validación.

Puede pasar los siguientes parámetros a jsonSchema():

  • schemaMatriz que especifica las reglas de validación de la colección. Para obtener más información sobre la construcción de un esquema, consulte la referencia de $jsonSchema en el manual del servidor.

  • validationLevel: Establece el nivel de aplicación de la validación. Los valores aceptados son "strict" (predeterminado) y "moderate".

  • validationAction: Especifica la acción que se debe tomar cuando se intentan operaciones no válidas. Los valores aceptados son "error" (predeterminado) y "warn".

Este ejemplo muestra cómo especificar un esquema en el método jsonSchema() al crear una colección. La validación del esquema tiene las siguientes especificaciones:

  • Los documentos de la colección pilots deben contener el campo license_number.

  • El campo license_number debe tener un valor entero entre 1000 y 9999.

  • Si intenta realizar operaciones de escritura no válidas, el servidor genera un error.

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',
);
});

Si intenta insertar un documento en la pilots colección que viola la regla de validación del esquema, Laravel MongoDB devuelve una BulkWriteException.

Para comprobar si existe una colección, llame al método hasCollection() en la fachada Schema de su archivo de migración. Puede usarlo para ejecutar la lógica de migración condicionalmente.

El siguiente ejemplo de migración crea una colección telescopes si existe una colección llamada stars:

$hasCollection = Schema::hasCollection('stars');
if ($hasCollection) {
Schema::create('telescopes');
}

Los índices de MongoDB son estructuras de datos que mejoran la eficiencia de las consultas al reducir la cantidad de documentos necesarios para recuperar los resultados. Algunos índices, como los geoespaciales, amplían la forma de consultar los datos.

Para mejorar el rendimiento de las consultas mediante un índice, asegúrese de que este cubra la consulta. Para obtener más información sobre índices y optimización de consultas, consulte las siguientes entradas del manual del servidor:

Las siguientes secciones muestran cómo puedes utilizar el generador de esquemas para crear y descartar varios tipos de índices en una colección.

Para crear índices, realice las siguientes acciones:

  1. Llame al método create() en la fachada Schema en su archivo de migración.

  2. Pásele el nombre de la colección y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Especifique los detalles de creación del índice en la instancia Blueprint.

El siguiente ejemplo de migración crea índices en los siguientes campos de colección:

  • Índice de campo único en mission_type

  • Índice compuesto en launch_location y launch_date, especificando un orden de clasificación descendente en launch_date

  • Índice único en el campo mission_id, que especifica el nombre del índice "unique_mission_id_idx"

Haga clic en el VIEW OUTPUT Botón para ver los índices creados al ejecutar la migración, incluido el índice predeterminado en el 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
}
]

Las opciones de índice de MongoDB determinan cómo se usan y almacenan los índices. Puede especificar opciones de índice al llamar a un método de creación de índices, como index(), en una instancia Blueprint.

El siguiente código de migración muestra cómo añadir una intercalación a un índice como opción de índice. Haga clic en el botón VIEW OUTPUT para ver los índices creados al ejecutar la migración, incluido el índice predeterminado en el 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 obtener más información sobre las opciones de índice, consulte Opciones para todos los tipos de índice en el manual del servidor.

Puedes usar los métodos asistentes de MongoDB para Laravel para crear los siguientes tipos de índices:

  • Índices dispersos, que permiten entradas de índice solo para documentos que contienen el campo especificado

  • Índices de tiempo de vida (TTL), que expiran después de un tiempo establecido.

  • Índices únicos, que evitan la inserción de documentos que contengan valores duplicados para el campo indexado

Para crear estos tipos de índice, realice las siguientes acciones:

  1. Llame al método create() en la fachada Schema en su archivo de migración.

  2. Pase create() el nombre de la colección y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Llame al método auxiliar apropiado para el tipo de índice en la instancia Blueprint y pase los detalles de creación del índice.

El siguiente código de migración muestra cómo crear un índice disperso y uno TTL mediante los ayudantes de índice. Haga clic en el botón VIEW OUTPUT para ver los índices creados al ejecutar la migración, incluido el índice predeterminado en el 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
}
]

Puede especificar índices dispersos, TTL y únicos en un solo campo o en un índice compuesto especificándolos en las opciones de índice.

El siguiente código de migración muestra cómo crear los tres tipos de índices en un solo campo. Haga clic en el botón VIEW OUTPUT para ver los índices creados al ejecutar la migración, incluido el índice predeterminado en el 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 obtener más información sobre estos índices, consulte Propiedades del índice en el manual del servidor.

En MongoDB, los índices geoespaciales le permiten consultar datos de coordenadas geoespaciales para inclusión, intersección y proximidad.

Para crear índices geoespaciales, realice las siguientes acciones:

  1. Llame al método create() en la fachada Schema en su archivo de migración.

  2. Pase create() el nombre de la colección y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Especifique los detalles de creación del índice geoespacial en la instancia Blueprint.

El siguiente ejemplo de migración crea un índice geoespacial 2d y 2dsphere en la colección spaceports. Haga clic en el botón VIEW OUTPUT para ver los índices creados al ejecutar la migración, incluido el índice predeterminado en el 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 obtener más información sobre los índices geoespaciales, consulte Índices geoespaciales en el manual del servidor.

Para eliminar índices de una colección, realice las siguientes acciones:

  1. Llame al método table() en la fachada Schema en su archivo de migración.

  2. Pásele el nombre de la tabla y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Llame al método dropIndex() con el nombre de índice en la instancia Blueprint.

Nota

Si elimina una colección, MongoDB elimina automáticamente todos los índices asociados a ella.

El siguiente ejemplo de migración elimina un índice llamado unique_mission_id_idx de la colección flights:

Schema::table('flights', function (Blueprint $collection) {
$collection->dropIndex('unique_mission_id_idx');
});

En MongoDB, losíndices de búsqueda de MongoDB admiten consultas de texto completo. Losíndices de búsqueda vectorial de MongoDB admiten búsquedas por similitud que comparan los vectores de consulta con las incrustaciones vectoriales en los documentos.

Consulte las siguientes guías para obtener más información sobre las funciones de búsqueda de MongoDB y búsqueda de vectores de MongoDB:

  • Guía debúsqueda de MongoDB

  • Guíade búsqueda vectorial de MongoDB

Para crear índices de búsqueda de MongoDB, realiza las siguientes acciones:

  1. Llame al método create() en la fachada Schema en su archivo de migración.

  2. Pase create() el nombre de la colección y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Pase los detalles de creación del índice de búsqueda de MongoDB al método searchIndex() en la instancia Blueprint.

Este ejemplo de migración crea los siguientes índices de búsqueda de MongoDB en la colección galaxies:

  • dynamic_index:Crea asignaciones dinámicas

  • auto_index:Admite consultas de autocompletar en el campo name

Haga clic en el botón VIEW OUTPUT para ver los índices de búsqueda de MongoDB creados al ejecutar la migración:

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" }
] }
}
},
...
}

Para crear índices de búsqueda vectorial de MongoDB, realice las siguientes acciones:

  1. Llame al método create() en la fachada Schema en su archivo de migración.

  2. Pase create() el nombre de la colección y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Pase los detalles de creación del índice vectorial al método vectorSearchIndex() en la instancia Blueprint.

El siguiente ejemplo de migración crea un índice de búsqueda vectorial MongoDB llamado vs_index en la colección galaxies.

Haga clic en el botón VIEW OUTPUT para ver los índices de búsqueda vectorial de MongoDB creados al ejecutar la migración:

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"
} ]
},
...
}

Para eliminar un índice de búsqueda MongoDB o de búsqueda vectorial MongoDB de una colección, realice las siguientes acciones:

  1. Llame al método table() en la fachada Schema en su archivo de migración.

  2. Pásele el nombre de la colección y un método de devolución de llamada con un parámetro MongoDB\Laravel\Schema\Blueprint.

  3. Llame al método dropSearchIndex() con el nombre del índice MongoDB Search o MongoDB Vector Search en la instancia Blueprint.

El siguiente ejemplo de migración elimina un índice llamado auto_index de la colección galaxies:

Schema::table('galaxies', function (Blueprint $collection) {
$collection->dropSearchIndex('auto_index');
});

Volver

Relaciones