Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$map (operador de expresión)

$map

Aplica un expresión a cada elemento de un arreglo y devuelve un arreglo con los resultados aplicados.

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.

La expresión $map tiene la siguiente sintaxis:

{
$map: {
input: <expression>,
as: <string>,
arrayIndexAs: <string>,
in: <expression>
}
}
Campo
Especificación

input

Una expresión que se evalúa en un arreglo.

Si input se resuelve en null o hace referencia a un campo que falta, $map devuelve null.

Si input se resuelve en un valor que no es un arreglo ni nulo, el pipeline presenta errores.

as

Opcional. Un nombre para la variable que representa cada elemento individual del arreglo input. Si no se especifica un nombre, el nombre de la variable por defecto es this.

arrayIndexAs

Opcional. Un nombre para la variable de agregación que representa el índice del elemento actual en el input array. El índice del primer elemento del array 0 es.

Puedes usar el nombre de la variable en una expresión. Por ejemplo, si especificas arrayIndexAs: "myIndex", usas $$myIndex en la expresión. $$myIndex devuelve el índice del elemento actual en el array input.

Si omite,arrayIndexAs puede usar la variable de sistema en la expresión para devolver el índice del elemento $$IDX actual.

Para ver ejemplos, consulte Acceder al índice de cada elemento de una matriz y Usar $$IDX para acceder al índice.

Nuevo en la versión 8.3.

in

Una expresión que se aplica a cada elemento del arreglo input. La expresión hace referencia a cada elemento individualmente con el nombre de variable especificado en as.

Para obtener más información sobre las expresiones, consulta Expresiones.

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 ]
}
]

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 ]
}
]

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 ]
}
]

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.

  • isPrimary booleano que es true para el primer pasatiempo de la lista y false para 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 }
]

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 ] }
}
}
}
}
}
] )

Para aprender más sobre las expresiones utilizadas en los ejemplos anteriores, consulte:

Volver

$ltrim

En esta página