Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Desarrollador de query

En esta guía, aprenderás a usar la extensión de Integración de Laravel del generador de query de Laravel para trabajar con una base de datos MongoDB. El generador de queries te permite utilizar una única sintaxis e interfaz fluida para guardar queries en 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 Operaciones de lectura.

Laravel ofrece una fachada para acceder a la clase del generador de query DBy te permite realizar operaciones en bases de datos. Las fachadas, que son interfaces estáticas a clases, hacen que la sintaxis sea más concisa, evitan errores en tiempo de ejecución y mejoran la testabilidad.

La integración de Laravel proporciona el método DB table() para acceder a una colección. Encadena métodos para especificar comandos y cualquier restricción. Luego, encadena el método get() al final para ejecutar los métodos y recuperar los resultados. Para recuperar solo el primer resultado coincidente, encadena el método first() en lugar del método get(). A partir de Laravel MongoDB v5.0, el generador de query devuelve resultados como objetos stdClass.

El siguiente ejemplo muestra la sintaxis de una llamar al generador de query:

DB::table('<collection name>')
// chain methods by using the "->" object operator
->get();

Tip

Establecer conexión de base de datos

Antes de utilizar el método DB::table(), asegúrate de especificar MongoDB como tu conexión de base de datos por defecto en la aplicación. Para obtener instrucciones sobre cómo configurar la conexión a la base de datos, consulta el paso Configura tu conexión a MongoDB en el inicio rápido.

Si MongoDB no es la base de datos por defecto de tu aplicación, puede usar el método DB::connection() para especificar una conexión a MongoDB. Pasa 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:

  • Recuperar documentos coincidentes

  • Configurar opciones a nivel de Query

  • Modificar resultados de queries

  • Recuperar datos utilizando operaciones de MongoDB

  • Escribir datos mediante operaciones de guardar de MongoDB

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 utilizando el generador de consultas, importe el Illuminate\Support\Facades\DB facade y componga su consulta.

Esta sección incluye ejemplos de desarrolladores de query para operaciones de lectura en las siguientes categorías de operadores:

El siguiente ejemplo muestra cómo utilizar el método de generador de consultas where() para recuperar documentos de la colección movies que contengan un valor de campo imdb.rating exactamente igual a 9.3. Haz clic en el 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.",
...
}
]

Los ejemplos de esta sección muestran la sintaxis del generador de query que puedes usar para realizar las siguientes operaciones condicionales lógicas:

El siguiente ejemplo muestra cómo encadenar el método de creación de consultas orWhere() para recuperar documentos de la colección movies en los 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.

El siguiente ejemplo muestra cómo encadenar el método where() del generador de consultas para recuperar documentos de la colección movies que coincidan tanto con un valor imdb.rating mayor que 8.5 como con 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 tanto la notación de flecha (->) como la de punto (.) para acceder a campos anidados en un filtro de query. El ejemplo anterior usa notación de puntos para consultar el campo anidado imdb.rating, que es la sintaxis recomendada.

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();

El siguiente ejemplo muestra cómo encadenar el método where() del generador de consultas para recuperar documentos de la colección movies que cumplan las dos condiciones siguientes. Este ejemplo pasa un closure como primer parámetro del método del generador de consultas where() para agrupar el grupo lógico OR:

  • imdb.rating el valor es mayor que 8.5

  • year el valor es 1986 o 1996

$result = DB::connection('mongodb')
->table('movies')
->where('imdb.rating', '>', 8.5)
->where(function (Builder $query) {
return $query
->where('year', 1986)
->orWhere('year', 1996);
})->get();

Los ejemplos de esta sección muestran la sintaxis del builders de query que puede usar para igualar valores usando las siguientes query de rango y operaciones de verificación de tipo:

El siguiente ejemplo muestra cómo usar el método del generador de query whereBetween() para recuperar documentos de la colección movies que contienen un valor de 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 }, ... },
...
]

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();

El siguiente ejemplo muestra cómo usar el método de query whereIn() para recuperar documentos de la colección movies que cumplen al menos uno de los valores title del 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, ... },
...
]

El siguiente ejemplo muestra cómo usar el método de query where() para recuperar documentos de la colección movies en la que el valor de released es enero 15 de 2010, especificado en un objeto Carbon:

$result = DB::connection('mongodb')
->table('movies')
->where('released', Carbon::create(2010, 1, 15))
->get();

Nota

Filtro de query 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 deseas representar una fecha como una string en tu filtro de query en lugar de como un objeto Carbon, utiliza el método constructor de query whereDate(). El siguiente ejemplo recupera documentos de la colección movies en los que el valor released es el 15 de enero de 2010 y especifica la fecha como una string:

$result = DB::connection('mongodb')
->table('movies')
->whereDate('released', '2010-1-15')
->get();

El siguiente ejemplo muestra cómo utilizar el operador del query like con el método del generador de query where() para recuperar documentos de la colección movies utilizando 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", ...},
...
]

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. Por defecto, este método realiza una coincidencia que no distingue entre mayúsculas y minúsculas. Puedes habilitar la sensibilidad a mayúsculas y minúsculas pasando true como último parámetro al 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 usar el método whereLike() para encontrar documentos en los que el campo title tenga un valor que coincida con el patrón 'Start%' con sensibilidad a 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", ... },
...
]

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();

Los ejemplos de esta sección muestran la sintaxis del generador de consultas que puedes usar para realizar agregaciones. Las agregaciones son operaciones que calculan valores a partir de un conjunto de datos de resultados de query. Puedes usar agregaciones para calcular y devolver la siguiente información:

El siguiente ejemplo muestra cómo utilizar el método constructor de query groupBy() para recuperar datos de documentos agrupados por los valores compartidos del campo runtime. Este ejemplo encadena las siguientes operaciones para comparar documentos de la colección movies que contienen un valor rated de G e incluyen el campo title de una película para cada valor distinto runtime:

  • Emparejar solo los documentos que contengan un valor de campo rated de "G" usando el método where()

  • Agrupe los datos por los valores distintos del campo runtime, al que se le asigna el campo _id, utilizando el método groupBy()

  • Ordene los grupos por el campo runtime utilizando el método orderBy()

  • Devuelve title datos del último documento en el resultado agrupado especificándolo en el método get()

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

El siguiente ejemplo muestra cómo utilizar el método de creador de consultas count() para devolver el número de documentos contenidos en la colección movies:

$result = DB::table('movies')
->count();

El siguiente ejemplo muestra cómo utilizar el método max() query builder para retornar el valor numérico más alto del campo runtime de toda la colección movies:

$result = DB::table('movies')
->max('runtime');

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

El siguiente ejemplo muestra cómo usar el método avg() del generador de consultas 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');

El siguiente ejemplo muestra cómo utilizar el método generador 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');

El siguiente ejemplo muestra cómo agregar datos a partir de resultados que coinciden con una query. La query coincide con todas las películas posteriores al año 2000 y calcula el valor medio de imdb.rating de esas coincidencias utilizando el método avg():

$result = DB::table('movies')
->where('year', '>', 2000)
->avg('imdb.rating');

Puedes modificar la forma en que la integración de Laravel realiza operaciones estableciendo opciones en el generador de query. Puedes pasar un arreglo de opciones al método constructor de options() query para especificar opciones para la query.

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.

Esta sección incluye ejemplos del generador de query para las siguientes funciones que modifican el orden y el formato de los resultados de las query:

El siguiente ejemplo muestra cómo utilizar el método de creación de query orderBy() para ordenar los resultados que coincidan con el filtro especificado en el campo title según 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 }, ... },
...
]

El siguiente ejemplo muestra cómo utilizar el método del generador de query skip() para omitir los primeros cuatro resultados que coincidan 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();

El siguiente ejemplo muestra cómo utilizar el método query builder project() para encontrar documentos que contengan un valor de imdb.rating mayor que 8.5 y devolver solo los siguientes valores de campo:

  • Título de la película en el title

  • Segundo a cuarto valor del campo de arreglo cast, si existen

  • Campo _id de documento, el cual 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"
],
},
...
]

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.

Esta sección incluye ejemplos del generador de consultas que muestran cómo utilizar las siguientes operaciones de query específicas de MongoDB:

El siguiente ejemplo muestra cómo usar el método de constructor de query exists() para hacer coincidir documentos que contienen el campo random_review:

$result = DB::table('movies')
->exists('random_review', true);

Para más información sobre este operador del query, consulta $exists en el manual de servidor.

El siguiente ejemplo muestra cómo usar el operador del query all con el método de creación de query where() para hacer coincidir documentos que tengan un campo de arreglo writers que contenga 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 del query, consulte $all en el manual del servidor.

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 aprender más sobre este operador del query, consulte $size en el manual del servidor.

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.

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.

El siguiente ejemplo muestra cómo pasar el operador del query REGEX con el método de constructor de query where() para hacer coincidir document que contengan un campo title que coincida con la expresión regular especificada:

$result = DB::connection('mongodb')
->table('movies')
->where('title', 'REGEX', new Regex('^the lord of .*', 'i'))
->get();

Para aprender más sobre las queries de expresión regular en MongoDB, consulta $regex en el manual del servidor.

El siguiente ejemplo muestra cómo utilizar el método constructor de consultas whereRaw() para ejecutar una operación de query escrita utilizando la sintaxis de la API de query 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 Query 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.

El siguiente ejemplo muestra cómo pasar el operador del query elemMatch con el método del generador de queries where() para hacer coincidir documentos que contengan un elemento de arreglo que cumpla con al menos una de las condiciones de la query 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.

El siguiente ejemplo muestra cómo utilizar el método timeout() para especificar una duración máxima para esperar a 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 valor de maxTimeMS en segundos en lugar de milisegundos. Para obtener más información sobre el valor maxTimeMS, consulte MongoDBCollection::find() en la documentación de la biblioteca PHP.

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.

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 un índice 2d o 2dsphere en la colección. Para aprender a crear índices geoespaciales, consulta la sección Crear un índice geoespacial en la guía del Schema Builder.

Para aprender más sobre los objetos GeoJSON que MongoDB admite, consulta Objetos GeoJSON en el manual del servidor.

El siguiente ejemplo muestra cómo utilizar el operador del query near con el método del generador de query where() para hacer coincidir documentos que contienen una ubicación a hasta 50 metros de un 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, consulta el operador $near en el manual del servidor.

El siguiente ejemplo muestra cómo utilizar el operador del query geoWithin junto con el método del generador de queries where() para encontrar documentos que contengan 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();

El siguiente ejemplo muestra cómo usar el operador del query geoInstersects con el método del constructor de consultas where() para hacer coincidir documentos que contienen una ubicación que intersecta 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();

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, consulta el operador $geoNear en el Manual del servidor.

Esta sección incluye ejemplos del generador de consultas que muestran cómo usar las siguientes operaciones de escritura específicas de MongoDB:

A partir de v4.7, puedes realizar una operación de inserción usando cualquiera de los siguientes métodos del constructor de consultas:

  • upsert()Al utilizar este método, puedes realizar una agrupar inserciones para cambiar o insertar varios documentos en una sola operación.

  • update(): Cuando se utiliza este método, debe especificar la opción upsert para actualizar todos los documentos que coincidan con el filtro de query o insertar un documento si no se encuentran documentos que coincidan. Solo se admite este método inserción en las versiones v4.6 y anteriores.

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.

  • $uniqueByLista de campos que identifican de manera única los documentos en el primer parámetro de arreglo.

  • $update: Lista opcional de campos para actualizar si existe un documento coincidente. Si omites este parámetro, la Integración Laravel actualiza todos los campos.

El siguiente ejemplo muestra cómo usar el método upsert() creador de query para actualizar o insertar documentos basándose en las siguientes instrucciones:

  • Especifique un documento en el que el valor del campo title sea 'Inspector Maigret', el valor del campo recommended sea false y el valor del campo runtime sea 128.

  • Especifique un documento en el que el valor del campo title sea 'Petit Maman', el valor del campo recommended sea true y el valor del campo runtime sea 72.

  • Indique que el campo title identifica de manera única los documentos en el alcance de su operación.

  • Actualice solo el campo recommended en los documentos que coincidan.

$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().

El siguiente ejemplo muestra cómo utilizar el método update() query builder y la opción upsert para actualizar el documento correspondiente o insertar uno con los datos especificados si no existe. Cuando configuras la opción upsert en true y el documento no existe, el comando inserta tanto los datos como el campo title y el valor especificado en la operación de query 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ó.

A partir de la integración de Laravel v5.5, puedes realizar operaciones de multiplicación y división de valores numéricos utilizando los métodos multiply() y divide() del generador de consultas.

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, puedes pasar un parámetro de arreglo para realizar una actualización de $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.']);

El siguiente ejemplo muestra cómo utilizar el método increment() query builder 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 increment() query builder devuelve el número de documentos que actualizó la operación.

A partir de la integración de Laravel v4.8, también puedes utilizar el método de creación de consultas de incrementEach() para incrementar varios valores en una sola operación. El siguiente ejemplo utiliza el método incrementEach() para aumentar los valores de los campos awards.wins y imdb.votes en el documento correspondiente:

$result = DB::table('movies')
->where('title', 'Lost in Translation')
->incrementEach([
'awards.wins' => 2,
'imdb.votes' => 1050,
]);

Nota

Si pasas un campo al método increment() o incrementEach() que no tiene valor o que no existe en los documentos coincidentes, estos métodos inicializan el campo especificado al valor de incremento.

El siguiente ejemplo muestra cómo usar el método del generador 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 decrement() query builder devuelve el número de documentos que actualizó la operación.

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 pasas un campo al método decrement() o decrementEach() que no tenga valor o que no exista en los documentos coincidentes, estos métodos inicializan el campo especificado al valor de decremento.

El siguiente ejemplo muestra cómo usar el método de generador de consultas push() para agregar "Gary Cole" al campo de arreglo cast en el documento emparejado:

$result = DB::table('movies')
->where('title', 'Office Space')
->push('cast', 'Gary Cole');

El método push() query builder devuelve el número de documentos que actualizó la operación.

El siguiente ejemplo muestra cómo usar el método de generador de query pull() para remover el valor "Adventure" del campo genres en el documento que coincide con la query:

$result = DB::table('movies')
->where('title', 'Iron Man')
->pull('genres', 'Adventure');

El método pull() query builder devuelve el número de documentos que actualizó la operación.

El siguiente ejemplo muestra cómo usar el método builder de consultas unset() para remover el campo tomatoes.viewer y el valor del documento que coincida con la query:

$result = DB::table('movies')
->where('title', 'Final Accord')
->unset('tomatoes.viewer');

El método unset() query builder devuelve el número de documentos que actualizó la operación.

Volver

Constructor de esquema

En esta página