$map(聚合)

在本页面

定义

  • $map

    • 对 array 中的每个 item 应用表达,并返回带有应用结果的 array。

$map表达式具有以下语法:

{ $map: { input: <expression>, as: <string>, in: <expression> } }
领域规格
input一个表达解析为 array。
as可选的。 变量的 name 表示input array 的每个单独元素。如果未指定 name,则变量 name 默认为this
in应用于input array 的每个元素。表达式使用as中指定的变量 name 分别引用每个元素。

有关表达式的更多信息,请参阅表达式

例子

使用$map 添加到 array 的每个元素

名为grades的集合包含以下文档:

{ _id: 1, quizzes: [ 5, 6, 7 ] }
{ _id: 2, quizzes: [ ] }
{ _id: 3, quizzes: [ 3, 8, 9 ] }

以下聚合操作输出quizzes array 的每个成员增加 2 的文档。

db.grades.aggregate(
   [
      { $project:
         { adjustedGrades:
            {
              $map:
                 {
                   input: "$quizzes",
                   as: "grade",
                   in: { $add: [ "$$grade", 2 ] }
                 }
            }
         }
      }
   ]
)

此操作返回以下结果:

{ "_id" : 1, "adjustedGrades" : [ 7, 8, 9 ] }
{ "_id" : 2, "adjustedGrades" : [ ] }
{ "_id" : 3, "adjustedGrades" : [ 5, 10, 11 ] }

用$map 截断每个 array 元素

名为deliveries的集合包含以下文档:

{ "_id" : 1, "city" : "Bakersfield", "distances" : [ 34.57, 81.96, 44.24 ] }
{ "_id" : 2, "city" : "Barstow", "distances" : [ 73.28, 9.67, 124.36 ] }
{ "_id" : 3, "city" : "San Bernadino", "distances" : [ 16.04, 3.25, 6.82 ] }

以下聚合操作使用$trunc operator 将distances array 的每个成员截断为其 integer value。

db.deliveries.aggregate(
   [
      { $project:
         {  city: "$city",
            integerValues:
               { $map:
                  {
                     input: "$distances",
                     as: "integerValue",
                     in: { $trunc: "$$integerValue" }
                  }
            }
         }
      }
   ]
)

此操作返回以下结果:

{ "_id" : 1, "city" : "Bakersfield", "integerValues" : [ 34, 81, 44 ] }
{ "_id" : 2, "city" : "Barstow", "integerValues" : [ 73, 9, 124 ] }
{ "_id" : 3, "city" : "San Bernadino", "integerValues" : [ 16, 3, 6 ] }

管道有两个$map 操作

名为temperatures的集合包含以下文档:

{ "_id" : 1, "date" : "June 23", "temps" : [ 4, 12, 17 ] }
{ "_id" : 2, "date" : "July 7", "temps" : [ 14, 24, 11 ] }
{ "_id" : 3, "date" : "October 30", "temps" : [ 18, 6, 8 ] }

以下聚合操作使用两个$project阶段以摄氏度输出每个 array 温度,作为华氏温度的 aarray。第一个$project阶段使用_id: 0构造来抑制输出文档中的_id字段。

db.temperatures.aggregate(
   [
      { $project:
         {  _id: 0,
            date: "$date",
            tempsStep1:
               { $map:
                  {
                     input: "$temps",
                     as: "tempInCelsius",
                     in: { $multiply: [ "$$tempInCelsius", 9/5 ] }
                  }
               }
         }
      },
      { $project:
         {  date: "$date",
            "temps in Fahrenheit":
               { $map:
                  {
                     input: "$tempsStep1",
                     as: "tempStep1",
                     in: { $add: [ "$$tempStep1", 32 ] }
                  }
               }
         }
      }
   ]
)

此操作返回以下结果:

{ "date" : "June 23", "temps in Fahrenheit" : [ 39.2, 53.6, 62.6 ] }
{ "date" : "July 7", "temps in Fahrenheit" : [ 57.2, 75.2, 51.8 ] }
{ "date" : "October 30", "temps in Fahrenheit" : [ 64.4, 42.8, 46.4 ] }

也可以看看 $let