$map(数组表达式)

适用对象: MongoDB vCore

MongoDB 中的 $map 运算符用于将表达式应用于数组中的每个元素,并返回具有应用结果的数组。 此运算符可用于转换文档中的数组,例如修改每个元素或提取特定字段。

语法

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

parameters

说明
input 将向其应用表达式的数组。
as 数组中每个元素的变量名称。
in 要应用于每个元素的表达式。

示例

让我们了解 stores 数据集中的示例 json 的用法。

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

示例 1:提取类别名称

聚合管道筛选 stores 集合中的 _id,然后投影一个新字段 categoryNames,其中 salesByCategory 数组中的每个元素都使用 $map 运算符将其 totalSales 增加了 500。

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

查询返回 totalSales 的更新数据,并将 500 添加到示例 json 中的单个元素中。

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