Overview
En esta guía, aprenderá a usar la extensión de integración de Laravel del generador de consultas de Laravel para trabajar con una base de datos MongoDB. El generador de consultas le permite usar una sintaxis única y una interfaz fluida para escribir consultas para cualquier base de datos compatible.
Nota
La integración de Laravel extiende el generador de consultas de Laravel y el ORM de Eloquent, que puede ejecutar operaciones de base de datos similares. Para obtener más información sobre la recuperación de documentos mediante modelos de Eloquent, consulte Leer Operaciones.
Laravel proporciona una fachada para acceder a la clase generadora de consultas DB, que permite realizar operaciones con bases de datos. Las fachadas, que son interfaces estáticas para las clases, hacen que la sintaxis sea más concisa, evitan errores de ejecución y mejoran la capacidad de prueba.
La integración de Laravel proporciona el método DB table() para acceder a una colección. Encadene métodos para especificar comandos y cualquier restricción. Luego, encadene el método get() al final para ejecutar los métodos y obtener los resultados. Para obtener solo el primer resultado coincidente, encadene el método first() en lugar del método get(). A partir de Laravel MongoDB v5.0, el generador de consultas devuelve los resultados como objetos stdClass.
El siguiente ejemplo muestra la sintaxis de una llamada al generador de consultas:
DB::table('<collection name>') // chain methods by using the "->" object operator ->get();
Tip
Establecer conexión a la base de datos
Antes de usar el DB::table() método, asegúrese de especificar MongoDB como la conexión de base de datos predeterminada de su aplicación. Para obtener instrucciones sobre cómo configurar la conexión de base de datos, consulte el paso "Configurar su conexión a MongoDB" en la Guía de inicio rápido.
Si MongoDB no es la base de datos predeterminada de su aplicación, puede usar el método DB::connection() para especificar una conexión MongoDB. Pase el nombre de la conexión al método connection(), como se muestra en el siguiente código:
$connection = DB::connection('mongodb');
Esta guía proporciona ejemplos de los siguientes tipos de operaciones de generación de consultas:
Antes de empezar
Para ejecutar los ejemplos de código de esta guía, complete el tutorial de inicio rápido para configurar una aplicación web, cargar conjuntos de datos de muestra en su implementación de MongoDB y ejecutar el código de ejemplo desde un método de controlador. Para ver el código de salida esperado como documentos JSON, utilice el toJson() método que se muestra en el paso opcional "Ver los resultados como documentos JSON" del tutorial de inicio rápido.
Para realizar operaciones de lectura y escritura mediante el generador de consultas, importe la fachada Illuminate\Support\Facades\DB y componga su consulta.
Recuperar documentos coincidentes
Esta sección incluye ejemplos de generadores de consultas para operaciones de lectura en las siguientes categorías de operadores:
Ejemplo de método Where
El siguiente ejemplo muestra cómo usar el método de creación de consultas where() para recuperar documentos de la colección movies que contienen un valor de campo imdb.rating de exactamente 9.3. Haga clic en el botón
VIEW OUTPUT Botón para ver los resultados devueltos por la consulta:
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', 9.3) ->get();
[ { "title": "Cosmos", "year": 1980, "runtime": 60, "imdb": { "rating": 9.3, "votes": 17174, "id": 81846 }, "plot": "Astronomer Carl Sagan leads us on an engaging guided tour of the various elements and cosmological theories of the universe.", ... }, { "title": "The Shawshank Redemption", "year": 1994, "runtime": 142, "imdb": { "rating": 9.3, "votes": 1521105, "id": 111161 }, "plot": "Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.", ... }, { "title": "The Real Miyagi", "year": 2015, "runtime": 90, "imdb": { "rating": 9.3, "votes": 41, "id": 2313306 }, "plot": "The life of the greatest karate master of a generation.", ... } ]
Operaciones condicionales lógicas
Los ejemplos de esta sección muestran la sintaxis del generador de consultas que puede utilizar para realizar las siguientes operaciones condicionales lógicas:
Ejemplo de OR lógico
El siguiente ejemplo muestra cómo encadenar el método de generación de consultas orWhere() para recuperar documentos de la colección movies en la que el valor del campo _id es ObjectId('573a1398f29313caabce9682') o el valor del campo title es "Back to the Future":
$result = DB::connection('mongodb') ->table('movies') ->where('id', new ObjectId('573a1398f29313caabce9682')) ->orWhere('title', 'Back to the Future') ->get();
Nota
id Alias
Puedes usar el alias id en tus queries para representar el campo _id en los documentos de MongoDB, como se muestra en el código anterior. Cuando se utiliza el generador de consultas para ejecutar una operación de búsqueda, la integración de Laravel convierte automáticamente entre los nombres de campos _id y id. En los resultados de las query, el campo _id se presenta como id. Esto proporciona una mejor coherencia con Laravel, ya que el framework asume que cada registro tiene una llave primaria llamada id por defecto.
Debido a este comportamiento, no puedes tener dos campos separados id y _id en tus documentos.
Para saber cómo deshabilitar este comportamiento para los documentos incrustados, consulte la sección Deshabilitar el uso de la conversión del nombre del campo de identificación de la guía Opciones de conexión.
Ejemplo de AND lógico
El siguiente ejemplo muestra cómo encadenar el método de generación de consultas where() para recuperar documentos de la colección movies que coincidan con un valor imdb.rating mayor que 8.5 y un valor year menor que 1940:
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', '>', 8.5) ->where('year', '<', 1940) ->get();
Tip
Para compatibilidad con Laravel, Laravel MongoDB v5.1 admite la notación de flecha (->) y de punto (.) para acceder a los campos anidados en un filtro de consulta. El ejemplo anterior utiliza la notación de punto para consultar el campo anidado imdb.rating, que es la sintaxis recomendada.
Ejemplo de NO lógico
El siguiente ejemplo muestra cómo llamar al método del generador de consultas whereNot() para recuperar documentos de la colección movies que coincidan con los documentos cuyo valor imdb.rating no sea mayor que 2. Esto equivale a buscar coincidencias con todos los documentos cuyo valor imdb.rating sea menor o igual que 2:
$result = DB::connection('mongodb') ->table('movies') ->whereNot('imdb.rating', '>', 2) ->get();
Ejemplo de grupo de operadores lógicos anidados
El siguiente ejemplo muestra cómo encadenar el método del generador de consultas where() para recuperar documentos de la colección movies que cumplan las dos condiciones siguientes. Este ejemplo pasa un cierre como primer parámetro del método del generador de consultas where() para agrupar el grupo lógico OR:
imdb.ratingel valor es mayor que8.5yearEl valor es1986o1996
$result = DB::connection('mongodb') ->table('movies') ->where('imdb.rating', '>', 8.5) ->where(function (Builder $query) { return $query ->where('year', 1986) ->orWhere('year', 1996); })->get();
Rangos y comprobaciones de tipo
Los ejemplos de esta sección muestran la sintaxis del generador de consultas que puede utilizar para hacer coincidir valores mediante las siguientes consultas de rango y operaciones de verificación de tipo:
Ejemplo de rango numérico
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas whereBetween() para recuperar documentos de la colección movies que contienen un valor imdb.rating entre 9 y 9.5:
$result = DB::connection('mongodb') ->table('movies') ->whereBetween('imdb.rating', [9, 9.5]) ->get();
[ { "title" "The Godfather", "imdb": { "rating": 9.2, "votes": 1038358, "id": 68646 }, ... }, { "title": "Hollywood", "imdb": { "rating": 9.1, "votes": 511,"id": 80230 }, ... }, { "title": "Cosmos", "imdb": { "rating": 9.3, "votes": 17174, "id": 81846 }, ... }, ... ]
Ejemplo de valores nulos o faltantes
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas whereNull() para recuperar documentos de la colección movies que omiten un valor o campo runtime:
$result = DB::connection('mongodb') ->table('movies') ->whereNull('runtime') ->get();
Ejemplo de uno o más valores de un conjunto
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas whereIn() para recuperar documentos de la colección movies que coincidan con al menos uno de los valores title en el conjunto especificado:
$result = DB::table('movies') ->whereIn('title', ['Toy Story', 'Shrek 2', 'Johnny English']) ->get();
[ { "title": "Toy Story", "year": 1995, "runtime": 81, ... }, { "title": "Johnny English", "year": 2003, "runtime": 87, ... }, { "title": "Shrek 2", "year" 2004, "runtime": 93, ... }, ... ]
Ejemplo de fechas de coincidencia
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas where() para recuperar documentos de la colección movies en la que el valor released es enero 15, 2010, especificado en un objeto Carbon:
$result = DB::connection('mongodb') ->table('movies') ->where('released', Carbon::create(2010, 1, 15)) ->get();
Nota
Filtro de consulta de fecha y tipo de resultado
A partir de Laravel MongoDB v,5.0 los objetos Carbon pasados como filtros de consulta, como se muestra en el código anterior, se convierten en UTCDateTime valores BSON.
En los resultados de la consulta, los valores BSON UTCDateTime en MongoDB se devuelven como objetos Carbon. La integración de Laravel aplica la zona horaria predeterminada al realizar esta conversión.
Si desea representar una fecha como una cadena en su filtro de consulta en lugar de como un objeto Carbon, utilice el método de construcción de consultas whereDate(). El siguiente ejemplo recupera documentos de la colección movies cuyo valor released es enero 15, 2010 y especifica la fecha como una cadena:
$result = DB::connection('mongodb') ->table('movies') ->whereDate('released', '2010-1-15') ->get();
Ejemplo de coincidencia de patrones de texto
El siguiente ejemplo muestra cómo utilizar el operador de consulta like con el método de generación de consultas where() para recuperar documentos de la colección movies mediante un patrón de texto especificado.
Los patrones de texto pueden contener texto mezclado con los siguientes caracteres comodín:
%que coincide con cero o más caracteres_que coincide con un solo carácter
$result = DB::table('movies') ->where('title', 'like', '%spider_man%') ->get();
[ { "title": "Kiss of the Spider Woman", ... }, { "title": "Spider-Man", ... }, { "title": "Spider-Man 2", ...}, ... ]
Métodos whereLike() y whereNotLike()
Los siguientes métodos proporcionan la misma funcionalidad que usar el operador del query como para coincidir con los patrones:
whereLike()Coincide con un patrón especificado. De forma predeterminada, este método realiza una coincidencia sin distinguir entre mayúsculas y minúsculas. Puede habilitar la distinción entre mayúsculas y minúsculas pasandotruecomo último parámetro del método.whereNotLike(): Coincide con documentos en los que el valor del campo no contiene el patrón de cadena especificado.
El siguiente ejemplo muestra cómo utilizar el método whereLike() para hacer coincidir documentos en los que el campo title tiene un valor que coincide con el patrón 'Start%' con distinción entre mayúsculas y minúsculas habilitada:
$result = DB::connection('mongodb') ->table('movies') ->whereLike('title', 'Start%', true) ->get();
[ { "title": "Start-Up", ... }, { "title": "Start the Revolution Without Me", ... }, ... ]
Retrieve Distinct Values
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas distinct() para recuperar todos los diferentes valores del campo year para los documentos en las colecciones movies.
$result = DB::table('movies') ->distinct('year')->get();
Agregaciones
Los ejemplos de esta sección muestran la sintaxis del generador de consultas que puede usar para realizar agregaciones. Las agregaciones son operaciones que calculan valores a partir de un conjunto de datos de resultados de consulta. Puede usar las agregaciones para calcular y devolver la siguiente información:
Ejemplo de resultados agrupados por valores de campo comunes
El siguiente ejemplo muestra cómo usar el método del generador de consultas groupBy() para recuperar datos de documentos agrupados por valores compartidos del campo runtime. Este ejemplo encadena las siguientes operaciones para buscar documentos de la colección movies que contengan un valor rated de G e incluyan el campo title de una película por cada valor runtime distinto:
Coincidir únicamente con documentos que contengan un valor de campo
ratedde"G"mediante el métodowhere()Agrupe los datos por los valores distintos del campo
runtime, al que se le asigna el campo_id, utilizando el métodogroupBy()Ordene los grupos por el campo
runtimeutilizando el métodoorderBy()Devuelve
titledatos del último documento en el resultado agrupado especificándolo en el métodoget()
Tip
El método groupBy() llama al operador de agregación de MongoDB $group y al operador de acumulación $last. Para obtener más información sobre estos operadores, consulta $group (agregación) en el manual del Servidor.
$result = DB::table('movies') ->where('rated', 'G') ->groupBy('runtime') ->orderBy('runtime', 'asc') ->get(['title']);
[ ... { "_id": { "runtime": 64 }, "runtime": 64, "title": "Stitch! The Movie" }, { "_id": { "runtime": 67 }, "runtime": 67, "title": "Bartok the Magnificent" }, { "_id": { "runtime":68 }, "runtime": 68, "title": "Mickey's Twice Upon a Christmas" }, ... ]
Ejemplo de número de resultados
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas count() para devolver la cantidad de documentos contenidos en la colección movies:
$result = DB::table('movies') ->count();
Ejemplo de valor máximo de un campo
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas max() para devolver el valor numérico más alto del campo runtime de toda la colección movies:
$result = DB::table('movies') ->max('runtime');
Ejemplo de valor mínimo de un campo
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas min() para devolver el valor numérico más bajo del campo year de toda la colección movies:
$result = DB::table('movies') ->min('year');
Ejemplo de valor promedio de un campo
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas avg() para devolver el promedio numérico, o media aritmética, de los valores imdb.rating de toda la colección movies.
$result = DB::table('movies') ->avg('imdb.rating');
Ejemplo de valor sumado de un campo
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas sum() para devolver el total numérico de los valores imdb.votes de toda la colección movies:
$result = DB::table('movies') ->sum('imdb.votes');
Ejemplo de resultados coincidentes agregados
El siguiente ejemplo muestra cómo agregar datos de los resultados que coinciden con una consulta. La consulta busca todas las películas posteriores al año 2000 y calcula el valor promedio de imdb.rating de esas coincidencias mediante el método avg():
$result = DB::table('movies') ->where('year', '>', 2000) ->avg('imdb.rating');
Configurar opciones a nivel de Query
Puedes modificar la forma en que la integración de Laravel realiza operaciones configurando opciones en el generador de consultas. Puedes pasar una matriz de opciones al método options() del generador de consultas para especificar las opciones de la consulta.
El siguiente código demuestra cómo adjuntar un comentario a una consulta:
$result = DB::connection('mongodb') ->table('movies') ->where('year', 2000) ->options(['comment' => 'hello']) ->get();
El generador de consultas acepta las mismas opciones que se pueden configurar para el find() método en la biblioteca PHP de MongoDB. Algunas opciones para modificar los resultados de la consulta,skip como, sort limity, se pueden configurar directamente como métodos del generador de consultas y se describen en la sección "Modificar resultados de la consulta" de esta guía. Recomendamos utilizar estos métodos en lugar de pasarlos como opciones.
Modificar resultados de la consulta
Esta sección incluye ejemplos de generadores de consultas para las siguientes funciones que modifican el orden y el formato de los resultados de la consulta:
Ejemplo de resultados de pedidos
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas orderBy() para organizar los resultados que coinciden con el filtro especificado en el campo title por el valor imdb.rating en orden descendente:
$result = DB::table('movies') ->where('title', 'like', 'back to the future%') ->orderBy('imdb.rating', 'desc') ->get();
[ { "title": "Back to the Future", "imdb": { "rating":8.5,"votes":636511,"id":88763 }, ... }, { "title": "Back to the Future Part II", "imdb": { "rating":7.8,"votes":292539,"id":96874 }, ... }, { "title": "Back to the Future Part III", "imdb": {"rating":7.4,"votes":242390,"id":99088 }, ... }, ... ]
Ejemplo de omitir un número específico de resultados
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas skip() para omitir los primeros cuatro resultados que coinciden con el filtro especificado en el campo title, ordenados por el valor year en orden ascendente:
$result = DB::table('movies') ->where('title', 'like', 'star trek%') ->orderBy('year', 'asc') ->skip(4) ->get();
Mostrar un subconjunto de campos y valores de matriz en el ejemplo de resultados
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas project() para hacer coincidir documentos que contienen un valor imdb.rating mayor que 8.5 y devolver solo los siguientes valores de campo:
Título de la película en el
titleDel segundo al cuarto valor del campo de matriz
cast, si existenCampo de documento
_id, que se incluye automáticamente
$result = DB::table('movies') ->where('imdb.rating', '>', 8.5) ->project([ 'title' => 1, 'cast' => ['$slice' => [1, 3]], ]) ->get();
[ { "_id": { ... }, "title": "City Lights" "cast": [ "Florence Lee", "Harry Myers", "Al Ernest Garcia" ], }, { "_id": { ... }, "title": "Modern Times", "cast": [ "Paulette Goddard", "Henry Bergman", "Tiny Sandford" ] }, { "_id": { ... }, "title": "Casablanca" "cast": [ "Ingrid Bergman", "Paul Henreid", "Claude Rains" ], }, ... ]
Ejemplo de paginación de resultados
El siguiente ejemplo muestra cómo utilizar el método generador de consultas paginate() para dividir toda la colección movie en conjuntos de resultados independientes de 15 documentos. El ejemplo también incluye un orden de clasificación para organizar los resultados por el campo imdb.votes en orden descendente y una proyección que incluye sólo campos específicos en los resultados.
$resultsPerPage = 15; $projectionFields = ['title', 'runtime', 'imdb.rating']; $result = DB::table('movies') ->orderBy('imdb.votes', 'desc') ->paginate($resultsPerPage, $projectionFields);
Para obtener más información sobre la paginación, consulte Paginar los resultados del generador de consultas en la documentación de Laravel.
Recuperar datos mediante operaciones de MongoDB
Esta sección incluye ejemplos de generadores de consultas que muestran cómo utilizar las siguientes operaciones de consulta específicas de MongoDB:
Coincide con los documentos que contienen todos los campos especificados
Coincidir con documentos que contienen una cantidad específica de elementos en una matriz
Hacer coincidir documentos que contienen un tipo de datos particular en un campo
Coincidir con documentos que contienen un valor de módulo calculado
Coincidir con documentos que coincidan con una expresión regular
Contiene un ejemplo de campo
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas exists() para hacer coincidir documentos que contienen el campo random_review:
$result = DB::table('movies') ->exists('random_review', true);
Para obtener más información sobre este operador de consulta, consulte $exists en el manual del servidor.
Contiene ejemplo de todos los campos
El siguiente ejemplo muestra cómo utilizar el operador de consulta all con el método de generación de consultas where() para hacer coincidir documentos que tienen un campo de matriz writers que contiene todos los valores especificados:
$result = DB::table('movies') ->where('writers', 'all', ['Ben Affleck', 'Matt Damon']) ->get();
Para obtener más información sobre este operador de consulta, consulte $all en el manual del servidor.
Ejemplo de tamaño de matriz coincidente
El siguiente ejemplo muestra cómo pasar el operador del query size con el método de generador de query where() para hacer coincidir documentos que contengan un campo directors que contenga un arreglo de exactamente cinco elementos:
$result = DB::table('movies') ->where('directors', 'size', 5) ->get();
Para obtener más información sobre este operador de consulta, consulte $size en el manual del servidor.
Ejemplo de tipo de datos de coincidencia
El siguiente ejemplo muestra cómo pasar el operador de consulta type con el método de generación de consultas where() para hacer coincidir documentos que contienen un valor de tipo 4, que corresponde a un tipo de datos de matriz, en el campo released.
$result = DB::table('movies') ->where('released', 'type', 4) ->get();
Para obtener más información sobre los códigos de tipo y el operador de consulta, consulte $type en el manual del servidor.
Ejemplo de coincidencia de un valor calculado con módulo
El siguiente ejemplo muestra cómo pasar el operador del query mod con el método where() del generador de query para coincidir documentos utilizando la expresión year % 2 == 0, que coincide con los valores pares del campo year:
$result = DB::table('movies') ->where('year', 'mod', [2, 0]) ->get();
Para aprender más sobre este operador del query, consulta $mod en el manual del servidor.
Coincidir una expresión regular
El siguiente ejemplo muestra cómo pasar el operador de consulta REGEX con el método de generación de consultas where() para hacer coincidir documentos que contienen un campo title que coincide con la expresión regular especificada:
$result = DB::connection('mongodb') ->table('movies') ->where('title', 'REGEX', new Regex('^the lord of .*', 'i')) ->get();
Para obtener más información sobre las consultas de expresiones regulares en MongoDB, consulte $regex en el manual del servidor.
Ejemplo de ejecución de operaciones de la API de consulta de MongoDB
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas whereRaw() para ejecutar una operación de consulta escrita mediante la sintaxis de la API de consultas de MongoDB:
$result = DB::table('movies') ->whereRaw([ 'imdb.votes' => ['$gte' => 1000], '$or' => [ ['imdb.rating' => ['$gt' => 7]], ['directors' => ['$in' => ['Yasujiro Ozu', 'Sofia Coppola', 'Federico Fellini']]], ], ])->get();
El siguiente código muestra la sintaxis equivalente de la API de consulta de MongoDB:
db.movies.find({ "imdb.votes": { $gte: 1000 }, $or: [{ imdb.rating: { $gt: 7 }, directors: { $in: [ "Yasujiro Ozu", "Sofia Coppola", "Federico Fellini" ] } }]});
Para obtener más información sobre la API de consulta de MongoDB, consulte API de consulta de MongoDB en el manual del servidor.
Ejemplo de elementos de una matriz de coincidencias
El siguiente ejemplo muestra cómo pasar el operador de consulta elemMatch con el método de generación de consultas where() para hacer coincidir documentos que contienen un elemento de matriz que coincide con al menos una de las condiciones en la consulta especificada:
$result = DB::table('movies') ->where('writers', 'elemMatch', ['$in' => ['Maya Forbes', 'Eric Roth']]) ->get();
Para obtener más información sobre las consultas de expresiones regulares en MongoDB, consulte el operador $elemMatch en el manual del servidor.
Ejemplo de especificación del tiempo de espera del cursor
El siguiente ejemplo muestra cómo utilizar el método timeout() para especificar una duración máxima de espera para que se completen las operaciones del cursor.
$result = DB::table('movies') ->timeout(2) // value in seconds ->where('year', 2001) ->get();
Nota
Esta configuración especifica un maxTimeMS valor en segundos en lugar de milisegundos. Para obtener más información sobre el maxTimeMS valor, consulte MongoDBCollection::find() en la documentación de la biblioteca PHP.
Ejemplo de especificar una preferencia de lectura
Puede controlar cómo la integración de Laravel dirige las operaciones de lectura a los miembros del conjunto de réplicas configurando una preferencia de lectura.
El siguiente ejemplo consulta la colección movies para encontrar documentos cuyo valor runtime sea mayor que 240. El ejemplo pasa el valor ReadPreference::SECONDARY_PREFERRED al método readPreference(), que envía la consulta a los miembros secundarios del conjunto de réplicas o al miembro principal si no hay secundarios disponibles:
$result = DB::table('movies') ->where('runtime', '>', 240) ->readPreference(ReadPreference::SECONDARY_PREFERRED) ->get();
Tip
Para saber más sobre la preferencia de lectura, consulta Preferencia de lectura en el manual del servidor de MongoDB.
Coincidir ubicaciones mediante operaciones geoespaciales
Los ejemplos de esta sección muestran la sintaxis del generador de consultas que puede utilizar para realizar consultas geoespaciales en GeoJSON o datos de pares de coordenadas para recuperar los siguientes tipos de ubicaciones:
Importante
Para realizar consultas GeoJSON en MongoDB, debe crear 2d 2dsphere un índice o en la colección. Para aprender a crear índices geoespaciales, consulte la sección "Crear un índice geoespacial" en la guía del Generador de esquemas.
Para obtener más información sobre los objetos GeoJSON que admite MongoDB, consulte Objetos GeoJSON en el manual del servidor.
Ejemplo de cerca de una posición
El siguiente ejemplo muestra cómo utilizar el operador de consulta near con el método de generación de consultas where() para hacer coincidir documentos que contienen una ubicación que se encuentra hasta 50 metros de un objeto de punto GeoJSON:
$results = DB::table('theaters') ->where('location.geo', 'near', [ '$geometry' => [ 'type' => 'Point', 'coordinates' => [ -86.6423, 33.6054, ], ], '$maxDistance' => 50, ])->get();
Para obtener más información sobre este operador, consulte el operador $near en el manual del servidor.
Ejemplo dentro de un área
El siguiente ejemplo muestra cómo utilizar el operador de consulta geoWithin con el método de generación de consultas where() para hacer coincidir documentos que contienen una ubicación dentro de los límites del objeto GeoJSON Polygon especificado:
$results = DB::table('theaters') ->where('location.geo', 'geoWithin', [ '$geometry' => [ 'type' => 'Polygon', 'coordinates' => [ [ [-72, 40], [-74, 41], [-72, 39], [-72, 40], ], ], ], ])->get();
Ejemplo de intersección de una geometría
El siguiente ejemplo muestra cómo utilizar el operador de consulta geoInstersects con el método de generación de consultas where() para hacer coincidir documentos que contienen una ubicación que se interseca con el objeto GeoJSON LineString especificado:
$results = DB::table('theaters') ->where('location.geo', 'geoIntersects', [ '$geometry' => [ 'type' => 'LineString', 'coordinates' => [ [-73.600525, 40.74416], [-72.600525, 40.74416], ], ], ])->get();
Ejemplo de datos de proximidad para coincidencias cercanas
El siguiente ejemplo muestra cómo utilizar el operador de agregación geoNear con el método de generación de consultas raw() para realizar una agregación que devuelve metadatos, como información de proximidad para cada coincidencia:
$results = DB::table('theaters')->raw( function (Collection $collection) { return $collection->aggregate([ [ '$geoNear' => [ 'near' => [ 'type' => 'Point', 'coordinates' => [-118.34, 34.10], ], 'distanceField' => 'dist.calculated', 'maxDistance' => 500, 'includeLocs' => 'dist.location', 'spherical' => true, ], ], ]); }, )->toArray();
Para obtener más información sobre este operador de agregación, consulte el operador $geoNear en el manual del servidor.
Escribir datos mediante operaciones de escritura de MongoDB
Esta sección incluye ejemplos de generadores de consultas que muestran cómo utilizar las siguientes operaciones de escritura específicas de MongoDB:
Ejemplo de insertar un documento
A partir de la versión v4.7, puede realizar una operación de upsert utilizando cualquiera de los siguientes métodos de generación de consultas:
upsert():Cuando utiliza este método, puede realizar una inserción y actualización por lotes para cambiar o insertar varios documentos en una sola operación.update()Al usar este método, debe especificar la opciónupsertpara actualizar todos los documentos que coincidan con el filtro de consulta o insertar un documento si no hay coincidencias. Este método upsert solo es compatible con las versiones v4.6 y anteriores.
Método Upsert
El método del constructor de consultas upsert(array $values, array|string $uniqueBy, array|null
$update) acepta los siguientes parámetros:
$values:Matriz de campos y valores que especifican documentos para actualizar o insertar.$uniqueBy:Lista de campos que identifican de forma única los documentos en el primer parámetro de la matriz.$updateLista opcional de campos que se actualizan si existe un documento coincidente. Si se omite este parámetro, la integración de Laravel actualiza todos los campos.
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas upsert() para actualizar o insertar documentos según las siguientes instrucciones:
Especifique un documento en el que el valor del campo
titlesea'Inspector Maigret', el valor del camporecommendedseafalsey el valor del camporuntimesea128.Especifique un documento en el que el valor del campo
titlesea'Petit Maman', el valor del camporecommendedseatruey el valor del camporuntimesea72.Indique que el campo
titleidentifica de forma única los documentos dentro del alcance de su operación.Actualice solo el campo
recommendeden los documentos coincidentes.
$result = DB::table('movies') ->upsert( [ ['title' => 'Inspector Maigret', 'recommended' => false, 'runtime' => 128], ['title' => 'Petit Maman', 'recommended' => true, 'runtime' => 72], ], 'title', 'recommended', );
El método de generación de consultas upsert() devuelve la cantidad de documentos que la operación actualizó, insertó y modificó.
Nota
El método upsert() no activa eventos. Para activar eventos desde una operación upsert, puede usar el método createOrFirst().
Método de actualización
El siguiente ejemplo muestra cómo usar el método de consulta update() y la opción upsert para actualizar el documento coincidente o insertar uno con los datos especificados si no existe. Si se establece la opción upsert en true y el documento no existe, el comando inserta tanto los datos como el campo y el valor title especificados en la consulta where():
$result = DB::table('movies') ->where('title', 'Will Hunting') ->update( [ 'plot' => 'An autobiographical movie', 'year' => 1998, 'writers' => ['Will Hunting'], ], ['upsert' => true], );
El método de generación de consultas update() devuelve la cantidad de documentos que la operación actualizó o insertó.
Ejemplo de multiplicar y dividir valores numéricos
A partir de Laravel Integration v5.5, puede realizar operaciones de multiplicación y división en valores numéricos utilizando los métodos de generación de consultas multiply() y divide().
El siguiente ejemplo muestra cómo utilizar los métodos multiply() y divide() para manipular los valores de los campos imdb.votes y runtime:
$result = DB::table('movies') ->where('year', 2001) ->multiply('imdb.votes', 5); $result = DB::table('movies') ->where('year', 2001) ->divide('runtime', 2);
Tip
Método update()
Puedes realizar las mismas operaciones usando el método update() y pasando un documento de actualización que incluya el operador $mul. Para más información sobre update(), consulte la guía Modificación de documentos.
Opcionalmente, puede pasar un parámetro de matriz para realizar una actualización $set en la misma operación, como se muestra en el siguiente ejemplo:
$result = DB::table('movies') ->where('year', 1958) ->multiply('runtime', 1.5, ['note' => 'Adds recovered footage.']);
Ejemplo de incremento de un valor numérico
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas increment() para agregar 3000 al valor del campo imdb.votes en el documento coincidente:
$result = DB::table('movies') ->where('title', 'Field of Dreams') ->increment('imdb.votes', 3000);
El método de generación de consultas increment() devuelve la cantidad de documentos que la operación actualizó.
A partir de Laravel Integration v4.8, también se puede usar el método incrementEach() del generador de consultas para incrementar varios valores en una sola operación. El siguiente ejemplo usa el método incrementEach() para incrementar los valores de los campos awards.wins y imdb.votes en el documento coincidente:
$result = DB::table('movies') ->where('title', 'Lost in Translation') ->incrementEach([ 'awards.wins' => 2, 'imdb.votes' => 1050, ]);
Nota
Si pasa un campo al método increment() o incrementEach() que no tiene valor o no existe en los documentos coincidentes, estos métodos inicializan el campo especificado con el valor de incremento.
Ejemplo de decremento de un valor numérico
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas decrement() para restar 0.2 del valor del campo imdb.rating en el documento coincidente:
$result = DB::table('movies') ->where('title', 'Sharknado') ->decrement('imdb.rating', 0.2);
El método de generación de consultas decrement() devuelve la cantidad de documentos que la operación actualizó.
A partir de la integración de Laravel v4.8, también se puede utilizar el método generador de consultas decrementEach() para disminuir varios valores en una sola operación. El siguiente ejemplo emplea el método decrementEach() para reducir los valores de los campos metacritic y imdb.rating en el documento emparejado:
$result = DB::table('movies') ->where('title', 'Dunkirk') ->decrementEach([ 'metacritic' => 1, 'imdb.rating' => 0.4, ]);
Nota
Si pasa un campo al método decrement() o decrementEach() que no tiene valor o no existe en los documentos coincidentes, estos métodos inicializan el campo especificado con el valor de decremento.
Ejemplo de agregar un elemento de matriz
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas push() para agregar "Gary Cole" al campo de matriz cast en el documento coincidente:
$result = DB::table('movies') ->where('title', 'Office Space') ->push('cast', 'Gary Cole');
El método de generación de consultas push() devuelve la cantidad de documentos que la operación actualizó.
Ejemplo de eliminar un elemento de matriz
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas pull() para eliminar el valor "Adventure" del campo genres del documento que coincide con la consulta:
$result = DB::table('movies') ->where('title', 'Iron Man') ->pull('genres', 'Adventure');
El método de generación de consultas pull() devuelve la cantidad de documentos que la operación actualizó.
Ejemplo de eliminar un campo
El siguiente ejemplo muestra cómo utilizar el método de generación de consultas unset() para eliminar el campo y el valor tomatoes.viewer del documento que coincide con la consulta:
$result = DB::table('movies') ->where('title', 'Final Accord') ->unset('tomatoes.viewer');
El método de generación de consultas unset() devuelve la cantidad de documentos que la operación actualizó.