mongodb Aggregation聚合操作之addField
在上一篇mongodb Aggregation聚合操作之group分组中详细介绍了mongodb聚合操作中的group使用以及参数细节。本篇将开始介绍Aggregation聚合操作中的addFields添加新字段操作。
说明:
将新字段添加到文档。与 $project相似,$addFields重塑流中的每个文档;具体而言,通过向输出文档添加新字段,该输出文档既包含输入文档中的现有字段,又包含新添加的字段。
语法:
{ $addFields: { <newField>: <expression>, ... } }
注意点:【如果新字段的名称与现有字段名称(包括_id)相同$addFields,则使用指定表达式的值覆盖该字段的现有值。】
语法:
{ $addFields: { <newField>: <expression>, ... } }
1. 示例
1.1. 添加字段嵌入文档中
初始化数据:
db.vehicles.insetMany([{ _id: 1, type: "car", specs: { doors: 4, wheels: 4 } },
{ _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } },
{ _id: 3, type: "jet ski" }])
示例:
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" } }
1.2. 覆盖已有的字段
初始化数据:
db.insertOne({ _id: 1, dogs: 10, cats: 15 })
示例:
db.animals.aggregate( [
{
$addFields: { "cats": 20 }
}
] )
结果:
{ _id: 1, dogs: 10, cats: 20 }
1.3. 使用两个$addFields阶段并使用表达式
初始化数据:
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阶段在输出文档中包含三个新字段:
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
}
1.4. 一个字段替换为另一个字段
数据初始化:
db.scores.insertMany([{ "_id" : 1, "item" : "tangerine", "type" : "citrus" },
{ "_id" : 2, "item" : "lemon", "type" : "citrus" },
{ "_id" : 3, "item" : "grapefruit", "type" : "citrus" }])
示例:【在下面的示例中,项目字段替换_id字段】
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" }
1.5. 向数组中添加元素
数据初始化:
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 }
])
示例:【利用$concatArrays表达式向现有homework数组字段添加元素7】
db.scores.aggregate([
{ $match: { _id: 1 } },
{ $addFields: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
])
结果:
{
"_id" : 1.0,
"student" : "Maya",
"homework" : [
10.0,
5.0,
10.0,
7.0
],
"quiz" : [
10.0,
8.0
],
"extraCredit" : 0.0
}