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

时间: 2024-10-13 07:10:51

mongoDB 文档更新的相关文章

MongoDB 文档字段增删改

MongoDB 基于CRUD(create,read,update,delete)方式实现了对集合上的文档进行增删改查.对于集合上字段的增删改,可以使用set或者unset修改器来实现.也可以使用文档替换的方式来实现.本文主要描述集合上字段的增删改,以及基于选项upsert的更新. 关于MongoDB文档更新可以参考:MongoDB 文档更新 一.语法描述 db.collection.update( <query>, //查询或过滤条件 <update>, //修改器(被修改键及内

mongoDB 文档删除

mongoDB文档删除等同于关系型数据库中删除满足条件的单条或者多条记录,通常使用db.collection.remove()方法来实现文档的删除动作.mongDB文档删除属于原子性操作,仅仅在仅仅在单个文档级别.本文描述mongoDB文档删除操作并给出示例. 预备热身 Linux下快速安装MongoDB Windows平台下安装MongoDB mongoDB 启动与停止 mongo shell连接到mongoDB及shell提示符下执行js脚本 mongoDB简介及关键特性 SQL与mongo

mongoDB 文档插入

mongoDB文档插入与SQL表insert方式基本相同.在关系数据库中,我们需要先定义表,然后才能将记录插入到文档,而在mongoDB中,由于无需预定义模式,因此,在集合不存在的情形下,直接insert就会生成新的集合.如果已经存在,则会在现有的集合内增加新文档.而且插入的文档可以与集合上的其他文档使用不同的键或键值类型.本文主要描述mongoDB文档插入,供大家参考. 预备热身 Linux下快速安装MongoDB Windows平台下安装MongoDB mongoDB 启动与停止 mongo

MongoDB文档和集合

1.文档是MongoDB最核心的概念,本质上是一种类JOSN的BSON格式的数据. BSON是一种类JSON的二进制格式数据,它可以理解为在JSON基础上添加了一些新的数据类型,包括日期.int32.int64等. BSON是由一组组键值对组成,它具有轻量性.可遍历性和高效性三个特征.可遍历性是MongoDB将BSON作为数据存储的主要原因. { field1:value1, field2:value2, field3:value3, field4:value4, } 2.使用MongoDB文档

php文档更新

  php.net最近更新了php文档,比较有用的是新增的pman工具.pman是一个命令行小工具,方便查看php函数的本地帮助文档,但是不包含php.net的评论数据.简单的试用心得如下: 安装pman 使用传说中的pear来安装pman sudo pear install doc.php.net/pman  如果pear版本比较老,需要先升级pear才可以继续 sudo pear upgrade pear  pman使用方法 pman的使用方法很傻瓜,比如我们想查看strlen的帮助信息:

mongoDB 文档查询

在关系型数据库中,可以实现基于表上各种各样的查询,以及通过投影来返回指定的列.对于NoSQL mongoDB而言,所有能够在单表上完成的查询,在mongoDB中也可以完全胜任.除此之外,由于mongoDB支持基于文档嵌套以及数组,因此mongoDB也可以实现基于嵌套文档和数组的查询.具体见下文描述. 预备热身 Linux下快速安装MongoDB Windows平台下安装MongoDB mongoDB 启动与停止 mongo shell连接到mongoDB及shell提示符下执行js脚本 mong

MongoDB文档对象字段属性合并的2种转换方法

现在,对MongoDB中文档对象冗余数据有中业务要求,就是对同种属性的字段进行合并成一个集合,效果如下图所示: 实现上述数据转换有2中方法:一种是基于NoSQL语言的实现方式,一种是基于kettle的业务数据转换. 1.基于NoSQL语言的实现方式 首先,在MongoDB里准备一个文档数据: [mongo@mongo ~]$ mongo MongoDB shell version: 3.2.7 connecting to: test > show dbs local  0.000GB zhul 

php文档更新介绍_php技巧

简单的试用心得如下: 安装pman 使用传说中的pear来安装pman sudo pear install doc.php.net/pman 如果pear版本比较老,需要先升级pear才可以继续 sudo pear upgrade pear pman使用方法 pman的使用方法很傻瓜,比如我们想查看strlen的帮助信息: pman strlen 帮助文本的内容是彩色的,能和chm版本的php帮助文档媲美.pman的详细使用帮助如下 #pman --help man, version 1.6c

MongoDB快速入门笔记(三)之MongoDB插入文档操作_MongoDB

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 本文给大家介绍MongoDB的插入文档的方法,一起看看吧 1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有"_id",如果没有会自动生成. shell操作有insert和save两种方法.当插入一条数据有