Definition 定义

向文档添加新字段。$addFields输出包含输入文档中所有现有字段新添加字段的文档。

$addFields stage 相当于 $project stage,它明确指定输入文档中的所有现有字段并添加新字段。

NOTE 从 4.2 版本开始,MongoDB 添加了一个新的 aggregation pipeline stage$set,它是$addFields的别名。

$addFields 具有以下形式:

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

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

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

Behavior 行为

$addFields将新字段追加到现有文档中。您可以在一个 aggregation operation 中包括一个或多个$addFieldsstages。

要向嵌入(embedded)文档(包括数组中的文档)添加一个或多个字段,请使用点符号。请参阅示例

要使用$addFields将元素添加到现有数组字段,请使用 $concatArrays。参阅示例

Examples 例子

Using Two $addFields Stages 使用两个$addFields阶段

一个名为scores的 collection 包含以下文档:

  1. {
  2. _id: 1,
  3. student: "Maya",
  4. homework: [ 10, 5, 10 ],
  5. quiz: [ 10, 8 ],
  6. extraCredit: 0
  7. }
  8. {
  9. _id: 2,
  10. student: "Ryan",
  11. homework: [ 5, 6, 5 ],
  12. quiz: [ 8, 8 ],
  13. extraCredit: 8
  14. }

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

  1. db.scores.aggregate( [
  2. {
  3. $addFields: {
  4. totalHomework: { $sum: "$homework" },
  5. totalQuiz: { $sum: "$quiz" }
  6. }
  7. },
  8. {
  9. $addFields: {
  10. totalScore: {
  11. $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ]
  12. }
  13. }
  14. }
  15. ] )

该 operation 返回以下文档:

  1. {
  2. "_id" : 1,
  3. "student" : "Maya",
  4. "homework" : [ 10, 5, 10 ],
  5. "quiz" : [ 10, 8 ],
  6. "extraCredit" : 0,
  7. "totalHomework" : 25,
  8. "totalQuiz" : 18,
  9. "totalScore" : 43
  10. }
  11. {
  12. "_id" : 2,
  13. "student" : "Ryan",
  14. "homework" : [ 5, 6, 5 ],
  15. "quiz" : [ 8, 8 ],
  16. "extraCredit" : 8,
  17. "totalHomework" : 16,
  18. "totalQuiz" : 16,
  19. "totalScore" : 40
  20. }

Adding Fields to an Embedded Document 向嵌入文档添加字段

使用点符号(dot notation)将新字段添加到嵌入文档(embedded document)。一个名为vehicles的 collection 包含以下文档:

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

以下 aggregation operation 将新字段fuel_type添加到嵌入(embedded)的文档规范(specs)中。

  1. db.vehicles.aggregate( [
  2. {
  3. $addFields: {
  4. "specs.fuel_type": "unleaded"
  5. }
  6. }
  7. ] )

该 operation 返回以下结果:

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

Overwriting an existing field 覆盖现有字段

$addFieldsoperation 中指定现有字段名称会导致替换原始字段。

一个名为animals的 collection 包含以下文档:

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

下面的$addFieldsoperation 指定了cats字段。

  1. db.animals.aggregate( [
  2. {
  3. $addFields: { "cats": 20 }
  4. }
  5. ] )

该 operation 返回以下文档:

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

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

一个名为fruit的 collection 包含以下文档:

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

以下 aggregation operation 使用$addFields将每个文档的_id字段替换为item字段的值,并将item字段替换为静态值(static value)。

  1. db.fruit.aggregation( [
  2. $addFields: {
  3. _id: "$item",
  4. item: "fruit"
  5. }
  6. ] )

该 operation 返回以下内容:

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

Add Element to an Array 将元素添加到数组

使用以下内容创建示例scorescollection:

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

您可以使用带有 $concatArrays expression 的$addFields将元素(element)添加到现有数组字段。 例如,以下 operation 使用$addFieldshomework字段替换为一个新数组,该数组的元素是当前homework数组与包含新分数[ 7 ]的另一个数组连接在一起。

  1. db.scores.aggregate( [
  2. { $match: { _id: 1 } },
  3. { $addFields: {
  4. homework: {
  5. $concatArrays: [ "$homework", [ 7 ] ]
  6. }
  7. }
  8. }
  9. ] )

该 operation 返回以下内容:

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

参考

https://docs.mongodb.com/manual/reference/operator/aggregation/addFields