Freigeben über


$map

Der $map Operator wird verwendet, um einen Ausdruck auf jedes Element in einem Array anzuwenden und ein Array mit den angewendeten Ergebnissen zurückzugeben. Dieser Operator eignet sich zum Transformieren von Arrays in Dokumenten, z. B. zum Ändern jedes Elements oder zum Extrahieren bestimmter Felder.

Syntax

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

Die Parameter

Parameter Description
input Das array, das vom Ausdruck verarbeitet wird.
as Der Variablename für jedes Element im Array.
in Der Ausdruck, der auf jedes Element angewendet werden soll.

Examples

Betrachten Sie dieses Beispieldokument aus der Stores-Sammlung.

{
    "_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"
    ]
}

Beispiel 1: Extrahieren von Kategorienamen

Diese Abfrage filtert die stores Auflistung nach _id, und projiziert dann ein neues Feld categoryNames , bei dem jedes Element im Array salesByCategory seine TotalSales um 500 mit dem operator $map erhöht hat.

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

Diese Abfrage gibt das folgende Ergebnis zurück.

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