$addFields (aggregation)

在本页面

Definition

将新字段添加到文档。 $addFields输出包含 Importing 文档中所有现有字段和新添加的字段的文档。

$addFields阶段等效于$project阶段,该阶段明确指定 Importing 文档中的所有现有字段并添加新字段。

$addFields的格式如下:

{ $addFields: { <newField>: <expression>, ... } }

指定要添加的每个字段的名称,并将其值设置为aggregation expression。有关表达式的更多信息,请参见Expressions

Important

如果新字段的名称与现有字段的名称相同(包括_id),则$addFields用指定表达式的值覆盖该字段的现有值。

Behavior

$addFields将新字段追加到现有文档中。您可以在一个聚合操作中包含一个或多个$addFields阶段。

要将一个或多个字段添加到嵌入式文档(包括数组中的文档),请使用点符号。参见example

要将元素添加到具有$addFields的现有数组字段中,请与$concatArrays一起使用。参见example

Examples

使用两个$ addFields 阶段

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

{
  _id: 1,
  student: "Maya",
  homework: [ 10, 5, 10 ],
  quiz: [ 10, 8 ],
  extraCredit: 0
}
{
  _id: 2,
  student: "Ryan",
  homework: [ 5, 6, 5 ],
  quiz: [ 8, 8 ],
  extraCredit: 8
}

以下操作使用两个$addFields阶段在输出文档中包括三个新字段:

db.scores.aggregate( [
   {
     $addFields: {
       totalHomework: { $sum: "$homework" } ,
       totalQuiz: { $sum: "$quiz" }
     }
   },
   {
     $addFields: { totalScore:
       { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }
   }
] )

该操作返回以下文档:

{
  "_id" : 1,
  "student" : "Maya",
  "homework" : [ 10, 5, 10 ],
  "quiz" : [ 10, 8 ],
  "extraCredit" : 0,
  "totalHomework" : 25,
  "totalQuiz" : 18,
  "totalScore" : 43
}
{
  "_id" : 2,
  "student" : "Ryan",
  "homework" : [ 5, 6, 5 ],
  "quiz" : [ 8, 8 ],
  "extraCredit" : 8,
  "totalHomework" : 16,
  "totalQuiz" : 16,
  "totalScore" : 40
}

将字段添加到嵌入式文档

使用点表示法将新字段添加到嵌入式文档中。名为vehicles的集合包含以下文档:

{ _id: 1, type: "car", specs: { doors: 4, wheels: 4 } }
{ _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } }
{ _id: 3, type: "jet ski" }

以下聚合操作将新字段fuel_type添加到嵌入式文档specs

db.vehicles.aggregate( [
        {
           $addFields: {
              "specs.fuel_type": "unleaded"
           }
        }
   ] )

该操作返回以下结果:

{ _id: 1, type: "car",
   specs: { doors: 4, wheels: 4, fuel_type: "unleaded" } }
{ _id: 2, type: "motorcycle",
   specs: { doors: 0, wheels: 2, fuel_type: "unleaded" } }
{ _id: 3, type: "jet ski",
   specs: { fuel_type: "unleaded" } }

覆盖现有字段

$addFields操作中指定现有字段名称将导致替换原始字段。

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

{ _id: 1, dogs: 10, cats: 15 }

以下$addFields操作指定cats字段。

db.animals.aggregate( [
  {
    $addFields: { "cats": 20 }
  }
] )

该操作返回以下文档:

{ _id: 1, dogs: 10, cats: 20 }

可以将一个字段替换为另一个字段。在以下示例中,item字段替代了_id字段。

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

{ "_id" : 1, "item" : "tangerine", "type" : "citrus" }
{ "_id" : 2, "item" : "lemon", "type" : "citrus" }
{ "_id" : 3, "item" : "grapefruit", "type" : "citrus" }

以下聚集操作使用$addFields将每个文档的_id字段替换为item字段的值,并将item字段替换为静态值。

db.fruit.aggregate( [
  {
    $addFields: {
      _id : "$item",
      item: "fruit"
    }
  }
] )

该操作返回以下内容:

{ "_id" : "tangerine", "item" : "fruit", "type" : "citrus" }
{ "_id" : "lemon", "item" : "fruit", "type" : "citrus" }
{ "_id" : "grapefruit", "item" : "fruit", "type" : "citrus" }

将元素添加到数组

创建具有以下内容的示例scores集合:

db.scores.insertMany([
   { _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 },
   { _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 }
])

您可以使用$addFields$concatArrays表达式将元素添加到现有数组字段中。例如,以下操作使用$addFields用新数组替换homework字段,该数组的元素是当前homework数组与另一个包含新分数[ 7 ]的数组连接。

db.scores.aggregate([
   { $match: { _id: 1 } },
   { $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
])

该操作返回以下内容:

{ "_id" : 1, "student" : "Maya", "homework" : [ 10, 5, 10, 7 ], "quiz" : [ 10, 8 ], "extraCredit" : 0 }
首页