Puntos clave: La proyección MongoDB permite a los usuarios recuperar selectivamente campos específicos de documentos, mejorando la gestión y el rendimiento de los datos. Utiliza operadores como $elemMatch, $slice y $meta para la extracción de datos personalizada.
- La proyección reduce el uso de recursos durante las consultas.
- Los operadores proporcionan funcionalidades avanzadas para la recuperación de datos específicos.
En MongoDB, utilizamos el método find() para recuperar datos. Sin embargo, find() recupera todos los campos de un documento sin ningún filtrado. La proyección de MongoDB resuelve este problema al permitir que la función find() se utilice con argumentos de filtrado de datos, lo que permite a los usuarios extraer solo los campos de datos necesarios de un documento. En este artículo práctico, te mostraremos:
Cómo funciona la proyección de MongoDB
La proyección de MongoDB está una herramienta potente que puede usarse para extraer solo los campos que tú necesitas de un documento, no todos los campos. Te permite:
- Proyecto datos concisos y transparentes
- Filtra el conjunto de datos sin afectar al rendimiento general de la base de datos
Como la proyección de MongoDB están construida sobre el método find() existente, te puede utiliza cualquier consulta de proyección sin modificaciones significativas en las funciones existentes. Además, la proyección están un factor clave al encontrar datos específicos del usuario de un conjunto de datos dado.
Sintaxis básica de la proyección de MongoDB
db.collection_name.find({},{ : })
La proyección de MongoDB utiliza la misma sintaxis de búsqueda, pero también añadimos un conjunto de parámetros a la función de búsqueda. Este conjunto de parámetros informa a la instancia de MongoDB de qué campos devolver. Consideremos la siguiente colección llamada "vehicleinformation"
Intentaremos recuperar el año modelo del vehículo Haz Toyota (Haz: 'Toyota') Declaración de búsqueda normal()
db.vehicleinformation.find({make : "Toyota"}).pretty()
Resultado:
En esta declaración, recibimos todos los datos dentro del documento donde Haz están Toyota. Para Obtén solo el año, podemos utiliza proyección, como se muestra a continuación. Declaración de proyección MongoDB
db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()
Resultado:
En la declaración de proyección, utiliza el campo año con el valor booleano 1 (True) para indicar que solo requerimos el campo "year". La limitación están que MongoDB devolverá el ID del objeto (_id) de cada documento a menos que especifiquemos explícitamente que no requerimos el ID del objeto. Excluye la declaración de proyección de MongoDB con "_id"
db.vehicleinformation.find({make : "Toyota"}, {year : 1, _id : 0}).pretty()
Resultado:
En esta afirmación, pasamos 0 como operador booleano para indicar que no necesitamos el campo ID del objeto.
Operadores en la proyección MongoDB
Utilizar el método de proyección de MongoDB para recuperar datos específicos de un documento impactará positivamente en el rendimiento de la base de datos porque reduce la carga de trabajo de la consulta de búsqueda, minimizando el uso de recursos. Para Reduce la carga de trabajo, MongoDB ofrece los siguientes operadores que pueden usarse dentro de una consulta de proyección:
- $
- $elemMatch
- $slice
- $meta
$ Operador
El operador $ se están utilizado para limitar el contenido de un array y proyectar el primer elemento que coincide con la condición de consulta en el campo del array. A partir de MongoDB 4.4, si no está presente ninguna condición de consulta, el primer elemento se devolverá en el array especificado. Sintaxis:
db.collection.find( { : ... }, { ".$": 1 } )
Limitaciones del operador $:
- Solo se puede usar un único operador $ en una sola consulta.
- La consulta debe consistir únicamente en una condición en el campo del array donde se va a aplicar.
- La función orden() en el método find() se aplicará antes que el operador $. Esta función puede hacer que el orden de ordenación no se represente correctamente.
- El operador $ solo puede aplicarse al final de un camino de campo. Esta restricción se introdujo en MongoDB 4.4 para mitigar cualquier problema de formato.
- La expresión de proyección $slice no puede usarse con el operador $ como parte de la misma expresión.
Vamos a utilizar la colección "studentgrades" para demostrar el operador $.
db.studentgrades.find({},{_id:0}).pretty()
Resultado:
Usando la colección "studentgrades", buscamos si un estudiante ha recibido calificaciones iguales o superiores a 80. Veamos Ve qué ocurre cuando no utiliza el operador $. El siguiente código hará que la consulta devuelva todos los valores del array como salida si algún elemento están igual o mayor que 80.
db.studentgrades.find( {grades: { $gte: 80}}, {"grades": 1})
Resultado:
Usar el operador $ solo devolverá el primer elemento donde están igual o superior a 80.
db.studentgrades.find( {grades: { $gte: 80}}, {"grades.$": 1})
Resultado:
$elemMatch Operador
$elemMatch operador limitará el contenido de un array al primer elemento que coincida con una condición dada. Esta condición difiere del operador $ porque el operador de proyección $elemMatch requiere un argumento explícito de condición. Vamos a Ve la sintaxis de usar $elemMatch en el método find(). Sintaxis:
db.collection.find( { : ... }, { ".$elemMatch": ($elemMatch operator) } )
Limitaciones del operador $elemMatch
- Independientemente del orden de los campos en el documento, el campo al que $elemMatch están proyección se devolverá como el último campo del documento.
- las operaciones find() realizadas en vistas de MongoDB no soportan $elemMatch operador de proyección.
- $text expresiones de consulta no son compatibles con el operador $elemMatch.
Vamos a utiliza la siguiente colección de "datos escolares" para demostrar el operador de $elemMatch.
db.schooldata.find()
Resultado:
Ahora ejecutaremos esto en un solo campo. Con el operador de $elemMatch, buscaremos escuelas en Londres con estudiantes que son diez años. El método pretty() están se usa para formatear la salida.
db.schooldata.find({address: "London"}, {"students" : {$elemMatch: {"age": "10"}}}).pretty()
Resultado:
En el siguiente ejemplo, marcaremos varios campos. Aquí comprobamos tanto la edad como el nombre de los estudiantes. Comprobamos si un estudiante llamado "Barry", que está de diez años, está asistiendo a algún colegio de Londres.
db.schooldata.find({address: "London"}, {"students" : {$elemMatch: {name: "barry", "age": "10"}}}).pretty()
Resultado:
$slice Operador de Proyección
El operador $slice especifica el número de elementos que deben devolverse como salida de una consulta. Sintaxis:
db.collection.find( , { : { $slice: } })
Limitaciones en $slice operador:
- Con la introducción de MongoDB 4.4, el operador $slice solo devolverá el elemento cortado. No devolverá ningún otro elemento en un array anidado.
- El operador de $slice no soporta la operación find() realizada en vistas de MongoDB.
- El operador $slice no puede usarse junto con el operador de proyección $ debido a la restricción de MongoDB, donde los campos de nivel superior no pueden consistir en $ (signo de dólar) como parte del nombre del campo.
- Las consultas no pueden contener la $slice de un array y un campo incrustado en el array como parte de la misma sentencia para eliminar colisiones de caminos de MongoDB 4.4.
Ahora vamos a utiliza la colección "schooldata" para demostrar el operador de $slice.
db.schooldata.find()
Resultado:
Vamos a cortar el primer elemento de un array. Para Lograr este resultado, utiliza el operador de $slice para cortar solo el primer elemento del array del estudiante.
db.schooldata.find({}, {students: {$slice : 1}})
Resultado:
Ahora, cortaremos el último elemento del array. utiliza al operador de $slice con "-1" para indicar el último registro.
db.schooldata.find({}, {students: {$slice : -1}})
Resultado:
Para saltar elementos, tenemos que Define los elementos que se omitirán y el número de elementos que se deben devolver. Los siguientes ejemplos demuestran este escenario. Salta el primer elemento y devuelve los dos siguientes:
db.schooldata.find({}, {students: {$slice : [1, 2]}})
Resultado:
En esta afirmación, cortamos el array "estudiantes" saltando el primer elemento y devolviendo los dos elementos restantes. Estos se definieron entre corchetes []. El primer valor están el elemento a ignorar, mientras que el segundo están cuántos elementos restantes deben devolverse. Si el array tiene menos de dos elementos tras saltarse el primero, devolverá todos los elementos restantes.
$meta Operador
El operador $meta están utiliza para obtener los metadatos asociados a un documento. El operador $meta puede usarse tanto con la Agregación MongoDB como con la proyección MongoDB. Esta sección solo cubrirá los conceptos básicos de la proyección MongoDB y cómo se usará el operador $meta en la proyección. El operador $meta utiliza la siguiente sintaxis.
{ $meta: }
Para la "metaDataKeyword", te puedes asociar estos valores:
- Palabra clave "textScore". La palabra clave "textScore" devolverá la puntuación asociada a la cadena de $text dada. Esta palabra clave básicamente encuentra cómo están coincide exactamente el término de búsqueda con el campo dado en un documento. $text consulta están obligatoria al usar la palabra clave "textScore" de MongoDB 4.4.
- Palabra clave "indexKey". Introducida en MongoDB 4.4 como alternativa preferida a la función cursor.returnKey(). Esta función devuelve una clave índice para un documento donde se está utilizado un índice no textual. Esta palabra clave están solo para fines de depuración, no para usarse en entornos de producción.
Uso y limitaciones de $meta operador en proyección:
- La expresión {$meta: "$textScore"} puede formar parte de una consulta de proyección en un documento para obtener la puntuación de texto. La expresión puede ser una inclusión o una exclusión en la instrucción de proyección. La única limitación están que si la expresión están asignada a un campo existente en el documento, el valor proyectado de los metadatos sobrescribirá el valor actual en el campo.
- te no puede Define "puntuación de texto" en el método find(). Por eso, la mejor opción están utiliza agregación de MongoDB.
- La expresión $meta puede usarse dentro de una función sort(). Los metadatos "textScore" se ordenarán en orden descendente.
- Cuando la expresión {$meta: "$textScore"} están incluida tanto en las funciones de proyección como de ordenación, cada función puede tener diferentes nombres de campo para la expresión. El sistema de consultas ignorará el nombre de campo en sort().
Ahora, veamos algunos ejemplos: para {$meta : "textScore"}, usaremos la colección de alimentos.
db.food.find().pretty()
Resultado:
Vamos a Crea un índice para la colección de "alimentos". Usaremos el campo "food_desc" para Crea un índice de texto.
db.food.createIndex({"food_desc": "text"})
Resultado:
Ahora busquemos la puntuación de texto. Nosotros utiliza la palabra "pizza" como término de búsqueda y utiliza al operador de $meta para obtener la puntuación de texto de cada uno de los documentos. El campo (_id: 0) están usa para omitir el id de objeto de cada documento para una salida más directa.
db.food.find( {$text : {$search: "pizza"}}, {score: {$meta: "textScore"}, _id: 0})
Resultado:
Ahora pasemos a {$meta: "indexKey"}. Como "indexKey" están estrictamente para fines de depuración, la documentación oficial de MongoDB indica lo siguiente.
NOTE
The { $meta: "indexKey" } expression is for debugging purposes only and not for application logic. MongoDB returns the value associated with the index chosen by the query system. The system can choose a different index upon subsequent execution.
For the selected index, the return value depends on how the database decides to represent values in an index and may change across versions. The represented value may not be the actual value for the field.
Los siguientes ejemplos son creados usando la colección "vehiclesales". Usando el campo {_id:0}, los identificadores de objetos son omiten en la salida.
db.vehiclesales.find({},{_id:0})
Resultado:
Aquí Crea un índice compuesto usando los campos "Haz" y "type".
db.vehiclesales.createIndex({make : 1, type: 1})
Resultado:
A continuación, hagamos una Proyección con un índice. Buscamos documentos en la colección "vehiclesales" donde el tipo están igual a "Sports" y utiliza el operador de $meta para obtener la clave de índice de cada documento.
db.vehiclesales.find({type: "Sports"},{idxKey: {$meta: "indexKey"}}).pretty()
Resultado:
¿Y qué pasa con las proyecciones sin índice? Si solicitamos un campo que no están parte del índice, la consulta no devolverá ningún valor ya que el índice será nulo. En este caso, el índice no se devolverá porque el campo precio no está parte del índice.
db.vehiclesales.find({price: {$gte: 47000}},{idxKey: {$meta: "indexKey"}}).pretty()
Resultado:
Y así concluye este tutorial informativo.
Lecturas relacionadas
Guía de MongoDB
- Resumen de MongoDB: Empezando con MongoDB
- Cómo instalar MongoDB en Ubuntu y Mac
- Creación de una base de datos en MongoDB
- Comandos básicos de MongoDB Shell
- MongoDB Compass: Uso de la interfaz gráfica de Mongo
- Explicación del Control de Acceso Basado en Roles (RBAC) de MongoDB
- Explicación de los operadores de proyección y proyección de MongoDB
- Explicación de las funciones agregadas de MongoDB
- Ordenación de MongoDB: método y ejemplos de sort()
- Uso de operadores de Push & Pull en MongoDB
- Cómo utiliza MongoDB $unwind
- 23 operadores comunes de consultas de MongoDB y cómo utilizarlos
- Ejemplos de consultas de geolocalización de MongoDB
- Introducción a las transacciones de MongoDB
- Índices de MongoDB: Principales tipos de índices y cómo gestionarlos
- Mejores comandos de MongoDB te necesitas saber
- Replicación de MongoDB: Una introducción completa
- Cómo configurar un clúster de MongoDB
- Fragmentos de MongoDB: Conceptos, Ejemplos y Tutoriales
- MongoDB Atlas: Configuración y uso de MongoDB gestionado
- Cómo ejecutar MongoDB como contenedor Docker
- Uso, gestión y requisitos de memoria de MongoDB
- Cómo utilizar Mongodump para copias de seguridad de MongoDB
- Ejemplos de Mongorestore para restaurar copias de seguridad de MongoDB
- Cómo utilizar PyMongo
- Cómo utilizar Mongoose para MongoDB y NodeJS
- Chuletas de MongoDB
- MongoDB vs Cassandra: Comparación de bases de datos NoSQL
- PostgreSQL vs MongoDB: Comparando bases de datos
- MySQL vs MongoDB: Comparando bases de datos
- Certificaciones MongoDB: Una introducción
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.