MongoDB 文档字段增删改

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

MongoDB 基于CRUD(create,read,update,delete)方式实现了对集合上的文档进行增删改查。对于集合上字段的增删改,可以使用set或者unset修改器来实现。也可以使用文档替换的方式来实现。本文主要描述集合上字段的增删改,以及基于选项upsert的更新。

a.语法描述

   db.collection.update(

      <query>,                  //查询或过滤条件

      <update>,                 //修改器(被修改键及内容)

      {                        

        upsert: <boolean>,      //为true或者false,如果为true,未找到匹配文档则创建新文档

        multi: <boolean>,       //用于确定是单行还是更新所有行(true为所有行)

        writeConcern: <document>  //设定写关注,用于确保强一致性还是弱一致性

      }                            //后面的3.2之后的语法参数基本相同

   )

其他的如updateOne,updateMany等用法请参考:MongoDB 文档更新

MongoDB集合上所有的写操作特性

原子性操作(单个文档级别原子性操作)

_id 字段无法修改,即无法使用一个新的_id值来代替

由于更新导致文档尺寸超出预期分配的情形,会自动调整填充因子,重新分配空间

保留文档字段的顺序,但是更新或重命名可能导致字段顺序重新排序(_id总是文档第一个字段)

update的几个常用修改器:

//$set修改器最常用,等同于RDBMSupdate的set子句

b.使用$set修改器修改年龄字段

> db.chenji.update({name:"李旭"},{$set:{"年龄":24}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

 

> db.chenji.find({$or:[{name:"李旭"}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "年纪" : "三年级",

       "年龄" : 24

}

> db.chenji.find({$or:[{name:"李旭"},{"年龄":24}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "年纪" : "三年级",

       "年龄" : 24

}

 

c. 文档新增字段($set实现)

> db.chenji.update({name:"李旭"},{$set:{add:"sex"}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"},{"年龄":24}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "年纪" : "三年级",

       "年龄" : 24,

       "add" : "sex"

 

查看新增字段add

> db.chenji.find({name:"李旭"},{"_id":0,"年纪":1,"年龄":1,add:1})

{ "年纪" : "三年级","年龄" : 24, "add" : "sex" }

d.文档删除字段

字段的删除方法为{"$unset":{field_name:1}}

> db.chenji.update({name:"李旭"},{"$unset":{add:1}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "年纪" : "三年级",

       "年龄" : 24

}

> db.chenji.find({name:"李旭"},{"_id":0,"年纪":1,"年龄":1,add:1})

{ "年纪" : "三年级","年龄" : 24 }

 

删除年龄字段:

> db.chenji.update({name:"李旭"},{"$unset":{"年龄":1}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "年纪" : "三年级"

}

删除年纪字段:

 

> db.chenji.update({name:"李旭"},{"$unset":{"年纪":1}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{ "_id" :ObjectId("59987eee7cd6cda607043cd1"), "name" : "李旭"}

 

添加字段:age和年龄

 

> db.chenji.update({name:"李旭"},{$set:{"年级":"一年级"}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.update({name:"李旭"},{$set:{"age":9}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "age" : 9,

       "年级" : "一年级"

}

 

e.字段值的增加或减少

当使用$inc修改器时,当字段不存在时,会自动创建该字段,如果存在,则在原有值的基础上进行增加或者减少

//$inc主要是用于专门进行数字的增加或减少,因此$inc只能用于整型,长整形,或者双精度浮点型的值

//$inc不支持字符串,数组以及其他非数字的值

//注,对于$inc的操作,$set也可以完成。$inc存在的理由是$inc更高效

 

> db.chenji.update({name:"李旭"},{$inc:{num:100}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "age" : 9,

       "年级" : "一年级",

       "num" : 100

}

再次update这个num字段会和第一次的100增加101

> db.chenji.update({name:"李旭"},{$inc:{num:101}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]})

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "age" : 9,

        "年级" : "一年级",

       "num" : 201

}

 

基于$inc的负值

> db.chenji.update({name:"李旭"},{$inc:{num:-100}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "age" : 9,

       "年级" : "一年级",

       "num" : 101

}

> db.chenji.update({name:"李旭"},{$inc:{num:-50}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "age" : 9,

       "年级" : "一年级",

       "num" : 51

 

 

下面使用非数字来实现$inc,报错如下

db.chenji.update({name:"李旭"},{$inc:{num:"1ab"}})

WriteResult({

       "nMatched" : 0,

       "nUpserted" : 0,

       "nModified" : 0,

       "writeError" : {

               "code" : 14,

               "errmsg" : "Cannot increment with non-numeric argument:{num: \"1ab\"}"

        }

})

 

f. 时间戳字段的增加及自动更新($currentDate)

> db.chenji.update({name:"李旭"},{$inc:{num:60},$currentDate:{lastModified:true}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "name" : "李旭",

       "age" : 9,

       "年级" : "一年级",

       "num" : 231,

       "lastModified" : ISODate("2017-08-20T08:39:53.601Z")

}

 

f.文档字段重命名($rename)

> db.chenji.update({name:"李旭"},{$rename:{"name":"ename"}})

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.chenji.find({$or:[{name:"李旭"}]}).pretty()

> db.chenji.find({$or:[{ename:"李旭"}]}).pretty()

{

       "_id" : ObjectId("59987eee7cd6cda607043cd1"),

       "age" : 9,

       "年级" : "一年级",

       "num" : 231,

       "lastModified" :ISODate("2017-08-20T08:39:53.601Z"),

       "ename" : "李旭"

}

> db.chenji.find({ename:"李旭"},{"_id":0,ename:1})

{ "ename" : "李旭"}

 

 

对整个集合上所有文档字段进行重命名:

>db.chenji.update({},{$rename:{"name":"ename"}},{multi:true})

WriteResult({ "nMatched" : 7,"nUpserted" : 0, "nModified" : 6 }) /此次修改为11条,因为前面以及修改过1

> db.chenji.find();

{ "_id" :ObjectId("59990ec402730a37fe1ee79e"), "年纪": "二年级", "年龄" : "12", "ename" :"建伟" }

{ "_id" :ObjectId("59987eee7cd6cda607043cd1"), "age" : 9, "年级": "一年级", "num" : 231, "lastModified" :ISODate("2017-08-20T08:39:53.601Z"), "ename" : "李旭"}

{ "_id" :ObjectId("5998860a7cd6cda607043cd2"), "年纪": "三年级", "年龄" : "14", "ename" :"张三" }

{ "_id" :ObjectId("599886227cd6cda607043cd3"), "年纪": "四年级", "年龄" : "16", "ename" :"王三" }

{ "_id" :ObjectId("599886357cd6cda607043cd4"), "年纪": "一年级", "年龄" : "8", "ename" :"王七" }

{ "_id" :ObjectId("599886537cd6cda607043cd5"), "年纪": "一年级", "年龄" : "9", "ename" :"张巴" }

{ "_id" :ObjectId("5998866e7cd6cda607043cd6"), "年纪": "七年级", "年龄" : "16", "ename" :"谢娜" }

 

g.upsert选项用法

/ upsert相当于oracle的merge into或者mysql中的replaceinto

// upsert即是当集合中匹配到满足条件的文档时,则更新文档,否则则是新增文档。前提是该选项的值为true,缺省为flase。


> //下面的演示的是匹配到文档时的例子

小结:

a、对于文档上数据的修改有多种方式(修改器),常用的为$set修改器以及$inc

b、$inc是一种高效的数据修改器,通常用于实现数值的增加或减少,仅支持数据类型。

c、对于文档字段的增加,可以使用$set,$unset,$inc,$currentDate等方式

d、对于文档字段的删除,使用$unset方式来实现

e、upsert选项可以实现匹配的文档则更新,不匹配时则插入

 参考资料:

http://blog.csdn.net/leshami/article/details/54930588


 本文转自 wjw555 51CTO博客,原文链接:http://blog.51cto.com/wujianwei/1957832


相关实践学习
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
相关文章
|
9天前
|
存储 JSON NoSQL
MongoDB的文档存储格式BSON和JSON的区别
MongoDB的文档存储格式BSON和JSON的区别
|
2月前
|
SQL NoSQL Java
文档型数据库MongoDB
文档型数据库MongoDB
|
3月前
|
存储 JSON NoSQL
【MongoDB】<文档型数据库>Windows&Liunx安装MongoDB(无错完整)
【1月更文挑战第26天】【MongoDB】<文档型数据库>Windows&Liunx安装MongoDB(无错完整)
|
3月前
|
消息中间件 SQL NoSQL
Flink mongodb支持CDAS 到那些下游?如果是不定格式的如何处理呀?mongodb的动态字段。
Flink mongodb支持CDAS 到那些下游?如果是不定格式的如何处理呀?mongodb的动态字段。【1月更文挑战第19天】【1月更文挑战第94篇】
99 6
|
8月前
|
存储 NoSQL MongoDB
MongoDB-文档之间关系
MongoDB对于文档的格式并没有强制性的要求, 但不等于我们不能在文档中表达数据的关系,在MongoDB中我们可以通过 ‘内嵌式结构’ 和 ‘规范式结构’ 来表达文档之间的关系。
56 0
|
4月前
|
NoSQL JavaScript 前端开发
MongoDB【CRUD练习-条件查询-文档关系】
MongoDB【CRUD练习-条件查询-文档关系】
|
8月前
|
SQL NoSQL 关系型数据库
mongoDB常用的操作 -(文档)
mongoDB常用的操作 -(文档)
47 0
|
9月前
|
存储 JSON NoSQL
MongoDB 插入文档
MongoDB 插入文档
58 0
|
9月前
|
SQL NoSQL MongoDB
MongoDB 更新文档
MongoDB 更新文档
33 0
|
9月前
|
NoSQL MongoDB 数据库
MongoDB 更新文档2
MongoDB 更新文档2
40 0