Definición
$mapAplica un expresión a cada elemento de un arreglo y devuelve un arreglo con los resultados aplicados.
Compatibilidad
Puedes usar $map para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
La expresión $map tiene la siguiente sintaxis:
{ $map: { input: <expression>, as: <string>, arrayIndexAs: <string>, in: <expression> } }
Campo | Especificación |
|---|---|
| Una expresión que se evalúa en un arreglo. Si Si |
| Opcional. Un nombre para la variable que representa cada elemento individual del arreglo |
| Opcional. Un nombre para la variable de agregación que representa el índice del elemento actual en el Puedes usar el nombre de la variable en una expresión. Por ejemplo, si especificas Si omite, Para ver ejemplos, consulte Acceder al índice de cada elemento de una matriz y Usar Nuevo en la versión 8.3. |
| Una expresión que se aplica a cada elemento del arreglo |
Para obtener más información sobre las expresiones, consulta Expresiones.
Ejemplos
Agregar a cada elemento de un arreglo
En mongosh, cree una colección de muestra llamada grades con los siguientes documentos:
db.grades.insertMany( [ { quizzes: [ 5, 6, 7 ] }, { quizzes: [ ] }, { quizzes: [ 3, 8, 9 ] } ] )
La siguiente operación de agregación utiliza $map con la expresión $add para incrementar cada elemento del arreglo quizzes en 2.
db.grades.aggregate( [ { $project: { adjustedGrades: { $map: { input: "$quizzes", as: "grade", in: { $add: [ "$$grade", 2 ] } } } } } ] )
Esta operación devuelve los siguientes resultados:
[ { _id: ObjectId("6390b8f7237da390c6869a62"), adjustedGrades: [ 7, 8, 9 ] }, { _id: ObjectId("6390b8f7237da390c6869a63"), adjustedGrades: [] }, { _id: ObjectId("6390b8f7237da390c6869a64"), adjustedGrades: [ 5, 10, 11 ] } ]
Truncar cada elemento del arreglo
En mongosh, cree una colección de muestra llamada deliveries con los siguientes documentos:
db.deliveries.insertMany( [ { "city" : "Bakersfield", "distances" : [ 34.57, 81.96, 44.24 ] }, { "city" : "Barstow", "distances" : [ 73.28, 9.67, 124.36 ] }, { "city" : "San Bernadino", "distances" : [ 16.04, 3.25, 6.82 ] } ] )
La siguiente operación de agregación usa $map para truncate cada elemento del arreglo distances a su valor entero.
db.deliveries.aggregate( [ { $project: { city: "$city", integerValues: { $map: { input: "$distances", as: "decimalValue", in: { $trunc: "$$decimalValue" } } } } } ] )
Esta operación devuelve los siguientes resultados:
[ { _id: ObjectId("6390b9b1237da390c6869a65"), city: 'Bakersfield', integerValues: [ 34, 81, 44 ] }, { _id: ObjectId("6390b9b1237da390c6869a66"), city: 'Barstow', integerValues: [ 73, 9, 124 ] }, { _id: ObjectId("6390b9b1237da390c6869a67"), city: 'San Bernadino', integerValues: [ 16, 3, 6 ] } ]
Convierta temperaturas Celsius a Fahrenheit
En mongosh, cree una colección de muestra llamada temperatures con los siguientes documentos:
db.temperatures.insertMany( [ { "date" : ISODate("2019-06-23"), "tempsC" : [ 4, 12, 17 ] }, { "date" : ISODate("2019-07-07"), "tempsC" : [ 14, 24, 11 ] }, { "date" : ISODate("2019-10-30"), "tempsC" : [ 18, 6, 8 ] } ] )
La siguiente operación de agregación utiliza la etapa $addFields para agregar un nuevo campo a los documentos llamado tempsF que contiene los equivalentes en Fahrenheit de los elementos del arreglo tempsC. Para convertir de Celsius a Fahrenheit, la operación utiliza $map para $multiply los valores en Celsius por 9/5 y, luego, $add 32.
db.temperatures.aggregate( [ { $addFields: { "tempsF": { $map: { input: "$tempsC", as: "tempInCelsius", in: { $add: [ { $multiply: [ "$$tempInCelsius", 9/5 ] }, 32 ] } } } } } ] )
Esta operación devuelve los siguientes resultados:
[ { _id: ObjectId("6390ba11237da390c6869a68"), date: ISODate("2019-06-23T00:00:00.000Z"), tempsC: [ 4, 12, 17 ], tempsF: [ 39.2, 53.6, 62.6 ] }, { _id: ObjectId("6390ba11237da390c6869a69"), date: ISODate("2019-07-07T00:00:00.000Z"), tempsC: [ 14, 24, 11 ], tempsF: [ 57.2, 75.2, 51.8 ] }, { _id: ObjectId("6390ba11237da390c6869a6a"), date: ISODate("2019-10-30T00:00:00.000Z"), tempsC: [ 18, 6, 8 ], tempsF: [ 64.4, 42.8, 46.4 ] } ]
Acceder al índice de cada elemento de una matriz.
Crea una colección de muestra llamada people con estos documentos:
db.people.insertMany( [ { _id: 1, name: "Melissa", hobbies: [ "softball", "drawing", "reading" ] }, { _id: 2, name: "Brad", hobbies: [ "gaming", "skateboarding" ] }, { _id: 3, name: "Scott", hobbies: [ "basketball", "music", "fishing" ] }, { _id: 4, name: "Tracey", hobbies: [ "acting", "yoga" ] }, { _id: 5, name: "Josh", hobbies: [ "programming" ] }, { _id: 6, name: "Claire" } ] )
El campo hobbies contiene una matriz con los pasatiempos de cada persona, ordenados por preferencia. El primer pasatiempo de la matriz es el principal, al que la persona dedica más tiempo. El primer pasatiempo tiene un índice de matriz de 0.
El siguiente ejemplo utiliza arrayIndexAs. La variable myIndex contiene el índice de cada pasatiempo en el array hobbies. El ejemplo devuelve documentos con los siguientes campos:
Nombre de la persona.
Nombre del pasatiempo.
Posición del pasatiempo en la lista de pasatiempos en el campo
rank.isPrimarybooleano que estruepara el primer pasatiempo de la lista yfalsepara los demás pasatiempos.
db.people.aggregate( [ { $project: { _id: 0, name: 1, rankedHobbies: { $map: { input: "$hobbies", as: "hobby", arrayIndexAs: "myIndex", in: { hobby: "$$hobby", rank: { $add: [ "$$myIndex", 1 ] }, isPrimary: { $eq: [ "$$myIndex", 0 ] } } } } } } ] )
Salida:
[ { name: 'Melissa', rankedHobbies: [ { hobby: 'softball', rank: 1, isPrimary: true }, { hobby: 'drawing', rank: 2, isPrimary: false }, { hobby: 'reading', rank: 3, isPrimary: false } ] }, { name: 'Brad', rankedHobbies: [ { hobby: 'gaming', rank: 1, isPrimary: true }, { hobby: 'skateboarding', rank: 2, isPrimary: false } ] }, { name: 'Scott', rankedHobbies: [ { hobby: 'basketball', rank: 1, isPrimary: true }, { hobby: 'music', rank: 2, isPrimary: false }, { hobby: 'fishing', rank: 3, isPrimary: false } ] }, { name: 'Tracey', rankedHobbies: [ { hobby: 'acting', rank: 1, isPrimary: true }, { hobby: 'yoga', rank: 2, isPrimary: false } ] }, { name: 'Josh', rankedHobbies: [ { hobby: 'programming', rank: 1, isPrimary: true } ] }, { name: 'Claire', rankedHobbies: null } ]
Utilice $$IDX para acceder al índice.
La variable devuelve el índice del elemento actual en $$IDX el input array. Puedes usar $$IDX si omites el arrayIndexAs campo de la expresión.
El siguiente ejemplo devuelve los mismos documentos que el ejemplo anterior en Acceder al índice de cada elemento de una matriz, pero utiliza $$IDX en lugar arrayIndexAs de:
db.people.aggregate( [ { $project: { _id: 0, name: 1, rankedHobbies: { $map: { input: "$hobbies", as: "hobby", in: { hobby: "$$hobby", rank: { $add: [ "$$IDX", 1 ] }, isPrimary: { $eq: [ "$$IDX", 0 ] } } } } } } ] )
Obtén más información
Para aprender más sobre las expresiones utilizadas en los ejemplos anteriores, consulte: