mongoDB 文档更新

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: mongoDB对于文档的更新,既可以实现文档的更新,也可以实现文档随意的增减键(列),这是与传统的关系型数据库最大的不同之处,也就是所谓的无模式带来的一定程度上的便利。

mongoDB对于文档的更新,既可以实现文档的更新,也可以实现文档随意的增减键(列),这是与传统的关系型数据库最大的不同之处,也就是所谓的无模式带来的一定程度上的便利。即mongoDB支持文档更新,也支持文档替换。本文给出了mongoDB更新语法及示例。

预备热身
Linux下快速安装MongoDB
Windows平台下安装MongoDB
mongoDB 启动与停止
mongo shell连接到mongoDB及shell提示符下执行js脚本
mongoDB简介及关键特性
SQL与mongoDB对比及映射

一、文档更新语法

    db.collection.update(
       <query>,                  //查询或过滤条件
       <update>,                 //修改器(被修改键及内容)
       {                         
         upsert: <boolean>,      //为true或者false,如果为true,未找到匹配文档则创建新文档
         multi: <boolean>,       //用于确定是单行还是更新所有行(true为所有行)
         writeConcern: <document>   //设定写关注,用于确保强一致性还是弱一致性
       }                            //后面的3.2之后的语法参数基本相同
    )

    db.collection.updateOne(   //仅3.2之后版本
       <filter>,
       <update>,
       {
         upsert: <boolean>,
         writeConcern: <document>
       }
    )

    db.collection.updateMany(  //仅3.2之后版本
       <filter>,
       <update>,
       {
         upsert: <boolean>,
         writeConcern: <document>
       }
    )

    db.collection.replaceOne(  //仅3.2之后版本,用于替换文档
       <filter>,
       <replacement>,
       {
         upsert: <boolean>,
         writeConcern: <document>
       }
    )

    更新相关事项
            mongoDB中所有写操作是基于单个文档基本的原子性操作(3.2版本后)
            _id类不支持更新,也不支持使用一个不同的_id文档进行替换
            文档的更新可能会导致文档变大,会重新申请及分配新的磁盘空间

二、演示文档更新

1、db.collection.updateOne()

    //演示环境
    db.version()  
    3.2.9

    //插入演示数据,此处略,参考:mongoDB文档查询 插入演示数据部分
    //链接地址   http://blog.csdn.net/leshami/article/details/52901240

    //下面查询favorites.artist值为Picasso的文档
    > db.users.find({"favorites.artist": "Picasso"},
        {finished:0,points:0,badges:0}).pretty()
    {
            "_id" : 1,
            "name" : "sue",
            "age" : 19,
            "type" : 1,
            "status" : "P",
            "favorites" : {
                    "artist" : "Picasso",
                    "food" : "pizza"
            }
    }
    {
            "_id" : 6,
            "name" : "abc",
            "age" : 43,
            "type" : 1,
            "status" : "A",
            "favorites" : {
                    "food" : "pizza",
                    "artist" : "Picasso"
            }
    }

    //下面对favorites.artist值为Picasso的文档进行更新
    //使用$set修改器来设置某个列的值,如下设置favorites.food的值pie,且type值为3
    //使用$currentDate为新增的列lastModified设置当前日期
    > db.users.updateOne(
           { "favorites.artist": "Picasso" },
           {
             $set: { "favorites.food": "pie", type: 3 },
             $currentDate: { lastModified: true }
           }
        )
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

    //查看更改后的文档结果
    > db.users.find({"favorites.artist": "Picasso"},
        {finished:0,points:0,badges:0}).pretty()
    {
            "_id" : 1,           //这个文档已经被修改,且新增了列
            "name" : "sue",
            "age" : 19,
            "type" : 3,
            "status" : "P",
            "favorites" : {
                    "artist" : "Picasso",
                    "food" : "pie"      
            },
            "lastModified" : ISODate("2016-09-30T07:25:28.135Z")
    }
    {
            "_id" : 6,       //而_id为6的这个文档没有被修改,即updateOne方法仅更新一个文档
            "name" : "abc",
            "age" : 43,
            "type" : 1,
            "status" : "A",
            "favorites" : {
                    "food" : "pizza",
                    "artist" : "Picasso"
            }
    }

2、db.collection.updateMany()

    //下面更新favorites.artist值为Picasso的文档,
    //更新的内容为favorites.artist值为Pisanello,type的值为3,且增加或修改lastModified字段
    > db.users.updateMany(
           { "favorites.artist": "Picasso" },
           {
             $set: { "favorites.artist": "Pisanello", type: 3 },
             $currentDate: { lastModified: true }
           }
        )
    { "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }  //此处提示有2个匹配的文档,更新数为2

    //再次查询favorites.artist值为Picasso的文档,其结果无任何文档返回,因为已经被更新
    > db.users.find({"favorites.artist": "Picasso"},
    ... {finished:0,points:0,badges:0}).pretty()

    //查询favorites.artist值为Pisanello的文档
    > db.users.find({"favorites.artist": "Pisanello"},
    ... {finished:0,points:0,badges:0}).pretty()
    {
            "_id" : 1,
            "name" : "sue",
            "age" : 19,   //Author : Leshami
            "type" : 3,   //Blog   : http://blog.csdn.net/leshami
            "status" : "P",
            "favorites" : {
                    "artist" : "Pisanello",
                    "food" : "pie"
            },
            "lastModified" : ISODate("2016-09-30T08:00:47.826Z")
    }
    {
            "_id" : 6,
            "name" : "abc",
            "age" : 43,
            "type" : 3,
            "status" : "A",
            "favorites" : {
                    "food" : "pizza",
                    "artist" : "Pisanello"
            },
            "lastModified" : ISODate("2016-09-30T08:00:47.826Z")
    }

3、db.collection.update()

    //下面使用db.collection.update()方式更新
    > db.users.update(
    ...    { "favorites.artist": "Pisanello" },
    ...    {
    ...      $set: { "favorites.food": "pizza", type: 0,  },
    ...      $currentDate: { lastModified: true }
    ...    }
    ... )              //此更新结果,如下行,nMatched为一个文档,nModified为1个文档,即仅更新一个文档
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })  //等同于updateOne方法

    > db.users.update(
    ...    { "favorites.artist": "Pisanello" },
    ...    {
    ...      $set: { "favorites.food": "pizza", type: 0,  },
    ...      $currentDate: { lastModified: true }
    ...    },
    ...    { multi: true }         //使用参数multi,且值为true
    ... )                          //从返回的结果可知,更新文档数为2,即所有满足条件的文档都被更新
    WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })  //等同于updateMany方法

    //验证更新之后的结果
    > db.users.find({"favorites.artist": "Pisanello"},
    ... {finished:0,points:0,badges:0}).pretty()
    {
            "_id" : 1,
            "name" : "sue",
            "age" : 19,
            "type" : 0,
            "status" : "P",
            "favorites" : {
                    "artist" : "Pisanello",
                    "food" : "pizza"
            },
            "lastModified" : ISODate("2016-09-30T09:31:10.524Z")
    }
    {
            "_id" : 6,
            "name" : "abc",
            "age" : 43,
            "type" : 0,
            "status" : "A",
            "favorites" : {
                    "food" : "pizza",
                    "artist" : "Pisanello"
            },
            "lastModified" : ISODate("2016-09-30T09:31:10.524Z")
    }

4、db.collection.replaceOne()

    //替换前文档的内容(name:"abc")
    > db.users.find({name:"abc"},{finished:0,points:0,badges:0}).pretty()
    {
            "_id" : 6,           
            "name" : "abc",
            "age" : 43,
            "type" : 1,
            "status" : "A",
            "favorites" : {
                    "food" : "pizza",
                    "artist" : "Picasso"
            }
    }

    //下面使用db.collection.replaceOne()替换用户名为abc的文档,且替换了很多不同的键值
    > db.users.replaceOne(
    ...    { name: "abc" },
    ...    { name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }
    ... )
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }  //这里提示有一个匹配,一个被更新

    //验证替换后的结果
    > db.users.find({name:"amy"},{finished:0,points:0,badges:0}).pretty()
    {
            "_id" : 6,
            "name" : "amy",
            "age" : 34,
            "type" : 2,
            "status" : "P",
            "favorites" : {
                    "artist" : "Dali",
                    "food" : "donuts"
            }
    }

    //使用db.collection.update方式可以实现相同的效果
    > db.users.update(
    ...    { name: "xyz" },
    ...    { name: "mee", age: 25, type: 1, status: "A", favorites: { "artist": "Matisse", food: "mango" } }
    ... )
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

三、小结

1、mongoDB文档更新有很多个不同的方法,传统的update,以及3.2版本之后的updateOne,updateMany
2、mongoDB文档替换也有很多个不通的方法,传统的update,以及3.2版本之后的replaceOnye,replaceMany
3、updateOne与updateMany是对update方法的扩展,update方法可以通过multi值为true或false来等同于updateMany以及updateOne
4、replaceOne与replaceMany也是对update方法的扩展,update方法可以通过multi值为true或false来等同于replaceMany以及replaceOne

DBA牛鹏社(SQL/NOSQL/LINUX)

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
2月前
|
NoSQL MongoDB 数据库
MongoDB 更新文档
10月更文挑战第14天
48 2
|
2月前
|
存储 NoSQL MongoDB
数据的存储--MongoDB文档存储(二)
数据的存储--MongoDB文档存储(二)
62 2
|
2月前
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
20 1
|
2月前
|
存储 NoSQL 关系型数据库
数据的存储--MongoDB文档存储(一)
数据的存储--MongoDB文档存储(一)
80 3
|
2月前
|
NoSQL MongoDB
MongoDB 删除文档
10月更文挑战第15天
48 0
|
2月前
|
存储 JSON NoSQL
MongoDB 插入文档
10月更文挑战第14天
34 0
|
3月前
|
SQL NoSQL Shell
03 MongoDB文档的各种增加、更新、删除操作总结
文章总结了MongoDB中文档的增删改操作,包括插入文档、更新现有文档以及删除文档的具体方法和示例。
115 0
|
7月前
|
存储 NoSQL 数据管理
【MongoDB 专栏】MongoDB 文档模型详解
【5月更文挑战第10天】MongoDB 是一种流行的 NoSQL 数据库,以其灵活的文档数据模型著称。文章介绍了文档的基本概念、结构及操作,包括插入、查询、更新和删除。文档特点是灵活且可扩展,适合存储不同结构的数据。优势在于简化数据建模、提升开发效率并适应动态数据。应用场景包括用户信息、日志记录和电商数据管理。但需注意数据一致性和文档大小对性能的影响。理解文档模型有助于高效利用 MongoDB。
94 1
【MongoDB 专栏】MongoDB 文档模型详解
|
5月前
|
存储 NoSQL MongoDB
MongoDB拆分大文档、嵌入文档
【7月更文挑战第6天】
52 0