Partager via


$map

L’opérateur $map est utilisé pour appliquer une expression à chaque élément d’un tableau et retourner un tableau avec les résultats appliqués. Cet opérateur est utile pour transformer des tableaux dans des documents, tels que la modification de chaque élément ou l’extraction de champs spécifiques.

Syntaxe

{
  $map: {
    input: <array>,
    as: <variable>,
    in: <expression>
  }
}

Paramètres

Paramètre Descriptif
input Tableau traité par l’expression.
as Nom de variable pour chaque élément du tableau.
in Expression à appliquer à chaque élément.

Examples

Considérez cet exemple de document de la collection des magasins.

{
    "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
    "name": "Lakeshore Retail",
    "location": {
        "lat": -51.3041,
        "lon": -166.0838
    },
    "staff": {
        "totalStaff": {
            "fullTime": 5,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 266491,
        "salesByCategory": [
            {
                "categoryName": "Towel Racks",
                "totalSales": 13237
            },
            {
                "categoryName": "Washcloths",
                "totalSales": 44315
            },
            {
                "categoryName": "Face Towels",
                "totalSales": 42095
            },
            {
                "categoryName": "Toothbrush Holders",
                "totalSales": 47912
            },
            {
                "categoryName": "Hybrid Mattresses",
                "totalSales": 48660
            },
            {
                "categoryName": "Napkins",
                "totalSales": 31439
            },
            {
                "categoryName": "Pillow Cases",
                "totalSales": 38833
            }
        ]
    },
    "tag": [
        "#ShopLocal",
        "#FashionStore",
        "#SeasonalSale",
        "#FreeShipping",
        "#MembershipDeals"
    ]
}

Exemple 1 : Extraction des noms de catégorie

Cette requête filtre la stores collection pour _id, puis projette un nouveau champ categoryNames dans lequel chaque élément du tableau salesByCategory a augmenté de 500 à l’aide de l’opérateur $map.

db.stores.aggregate([{
        $match: {
            _id: "988d2dd1-2faa-4072-b420-b91b95cbfd60"
        }
    },
    {
        $project: {
            categoryNames: {
                $map: {
                    input: "$sales.salesByCategory.totalSales",
                    as: "category",
                    in: {
                        $add: ["$$category", 500]
                    }
                }
            }
        }
    }
])

Cette requête retourne le résultat suivant.

[
  {
      "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
      "categoryNames": [
          13737,
          44815,
          42595,
          48412,
          49160,
          31939,
          39333
      ]
  }
]