美文网首页数据库mongodb基础操作
mongodb Aggregation聚合操作之addField

mongodb Aggregation聚合操作之addField

作者: 蚁族的乐土 | 来源:发表于2021-02-18 18:55 被阅读0次

    在上一篇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

    }

    相关文章

      网友评论

        本文标题:mongodb Aggregation聚合操作之addField

        本文链接:https://www.haomeiwen.com/subject/tkenxltx.html