Overview
Laravel proporciona una fachada para acceder a la clase generadora de esquemas Schema, lo que le permite crear y modificar tablas, o collections en MongoDB. Las fachadas son interfaces estáticas para clases que hacen que la sintaxis sea más concisa y mejoren 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 aprender más sobre fachadas, consulte Facades (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:
Realizar migraciones de Laravel
Las migraciones de Laravel te permiten crear, modificar y borrar de forma programática el esquema de tu base de datos ejecutando métodos incluidos en la fachada Schema. Las siguientes secciones explican cómo crear una clase de migración cuando se utiliza una base de datos MongoDB y cómo ejecutarlas.
Modificar bases de datos y colecciones desde dentro de una migración proporciona un enfoque controlado que garantiza la coherencia, el control de versiones y la reversibilidad en tu aplicación.
Crear una clase de migración
Puedes crear clases de migración manualmente o generarlas usando el comando php artisan make:migration. Si los generas, debes realizar los siguientes cambios para aplicar los cambios de esquema en tu base de datos MongoDB:
Reemplace la importación
Illuminate\Database\Schema\BlueprintconMongoDB\Laravel\Schema\Blueprintsi se hace referencia a ella en su migraciónUtilice ú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úrate de que tu
connectionsarreglo contenga una entradamongodbválida en tu archivoconfig/database.phpEspecifica
"mongodb"en el campo$connectionde tu clase de migración
La siguiente clase de migración de ejemplo contiene los siguientes métodos:
up(), lo que crea una colección y un índice cuando ejecutas la migracióndown(), la cual descarta la colección y todos sus índices cuando se revierte la migración
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'); } };
Ejecuta o revierte una migración
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 e í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 texto de 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 descartar 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.
Implementar la validación de esquemas
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ónSchema::table():Al actualizar las propiedades de la colección
Puedes usar la validación de esquemas para restringir los tipos de datos y los rangos de valores de los campos de documentos en una colección especificada. Después de implementar la validación de esquemas, el servidor restringe las operaciones de escritura que no siguen las reglas de validación.
Puedes 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 refuerzo de validación. Los valores aceptados son"strict"(por defecto) y"moderate".validationAction: Especifica la acción a tomar cuando se intenten operaciones no válidas. Los valores aceptados son"error"(por defecto) y"warn".
Este ejemplo demuestra cómo especificar un esquema en el método jsonSchema() al crear una colección. La validación de esquema tiene las siguientes especificaciones:
Los documentos de la colección
pilotsdeben contener el campolicense_number.El campo
license_numberdebe tener un valor entero entre1000y9999.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 intentas insertar un documento en la colección pilots que viole la regla de validación de esquema, Laravel MongoDB devolverá un BulkWriteException.
Verificar si una colección existe
Para comprobar si existe una colección, llama al método hasCollection() en la interfaz Schema en tu archivo de migración. Puede usar esto para ejecutar la lógica de migración de manera condicional.
La siguiente migración de ejemplo crea una colección telescopes si ya existe una colección llamada stars:
$hasCollection = Schema::hasCollection('stars'); if ($hasCollection) { Schema::create('telescopes'); }
Gestionar índices
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 de dichas consultas. Algunos índices, como los índices geoespaciales, amplían la forma en que se puede query.
Para mejorar el rendimiento de las queries utilizando un índice, asegúrese de que el índice cubra la query. Para obtener más información sobre índices y optimización de consultas, consulta 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.
Crear un índice
Para crear índices, realice las siguientes acciones:
Llama al método
create()en la fachadaSchemaen tu archivo de migración.Pase el nombre de la colección y una función de retorno con un parámetro
MongoDB\Laravel\Schema\Blueprint.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 activado
mission_typeÍndice compuesto en
launch_locationylaunch_date, especificando un orden de clasificación descendente enlaunch_dateÍndice único en el campo
mission_id, especificando 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 } ]
Especifica las opciones del índice
Las opciones de índice de MongoDB determinan cómo se utilizan y almacenan los índices. Puedes especificar opciones de índice al llamar a un método de creación de índice, como index(), en una instancia de 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.
Crear índices únicos, TTL y dispersos
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, los cuales evitan que se inserten documentos que contengan valores duplicados para el campo indexado
Para crear estos tipos de índice, realice las siguientes acciones:
Llama al método
create()en la fachadaSchemaen tu archivo de migración.Pase
create()el nombre de la colección y un método de devolución de llamada con un parámetroMongoDB\Laravel\Schema\Blueprint.Llama al método asistente apropiado para el tipo de índice en la instancia
Blueprinty pasa los detalles de creación del índice.
El siguiente código de migración muestra cómo crear un índice disperso y un índice TTL usando los asistentes de índice. Haz clic en el botón VIEW OUTPUT para ver los índices creados al ejecutar la migración, incluido el índice por defecto 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 } ]
Puedes especificar índices dispersos, TTL y únicos en un solo campo o índice compuesto especificándolos en las opciones del í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 de índice en el manual del servidor.
Crear un índice geoespacial
En MongoDB, los índices geoespaciales le permiten consultar datos de coordenadas geoespaciales para inclusión, intersección y proximidad.
Para crear índices geoespaciales, realiza las siguientes acciones:
Llama al método
create()en la fachadaSchemaen tu archivo de migración.Pase
create()el nombre de la colección y un método de devolución de llamada con un parámetroMongoDB\Laravel\Schema\Blueprint.Especifique los detalles de la creación del índice geoespacial en la instancia
Blueprint.
La siguiente migración de ejemplo 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.
Descartar un índice
Para descartar índices de una colección, realiza las siguientes acciones:
Llama al método
table()en la fachadaSchemaen tu archivo de migración.Pásale el nombre de la tabla y un método de función de retorno con un parámetro
MongoDB\Laravel\Schema\Blueprint.Llama al método
dropIndex()con el nombre del índice en la instanciaBlueprint.
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'); });
Gestionar MongoDB Search y MongoDB Vector Search índices
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.
Consulta las siguientes guías para obtener información sobre las funcionalidades de MongoDB Search y MongoDB Vector Search:
MongoDB búsqueda
Para crear índices de búsqueda de MongoDB, realiza las siguientes acciones:
Llama al método
create()en la fachadaSchemaen tu archivo de migración.Pase
create()el nombre de la colección y un método de devolución de llamada con un parámetroMongoDB\Laravel\Schema\Blueprint.Pasa los detalles de creación del índice de búsqueda de MongoDB al método
searchIndex()de la instanciaBlueprint.
Este ejemplo de migración crea los siguientes índices de MongoDB Search en la colección galaxies:
dynamic_indexCrea mapeos dinámicosauto_index: Admite consultas de autocompletar en el camponame
Haz 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" } ] } } }, ... }
Búsqueda vectorial de MongoDB
Para crear índice de MongoDB Vector Search, realice las siguientes acción:
Llama al método
create()en la fachadaSchemaen tu archivo de migración.Pase
create()el nombre de la colección y un método de devolución de llamada con un parámetroMongoDB\Laravel\Schema\Blueprint.Pase los detalles de creación del índice vectorial al método
vectorSearchIndex()en la instanciaBlueprint.
La siguiente migración de ejemplo crea un índice de MongoDB Vector Search llamado vs_index en la colección galaxies.
Haga clic en el botón VIEW OUTPUT para ver los índices de MongoDB Vector Search 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" } ] }, ... }
Eliminar un índice de búsqueda de MongoDB o de búsqueda vectorial de MongoDB
Para descartar un índice de MongoDB Search o MongoDB Vector Search de una colección, realiza las siguientes acciones:
Llama al método
table()en la fachadaSchemaen tu archivo de migración.Pase el nombre de la colección y una función de retorno con un parámetro
MongoDB\Laravel\Schema\Blueprint.Llame al método
dropSearchIndex()con el nombre del índice MongoDB Search o MongoDB Vector Search en la instanciaBlueprint.
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'); });