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 文档字段增删改相关推荐

  1. [MongoDB] MongoDB的基本操作以及文档的增删改查

    参考视频 链接:https://pan.baidu.com/s/1tAWPEC8yppyrPupkUFdCWQ 提取码:gdn8 MongoDB的基本操作 基本概念 生活中:仓库.架子.物品 计算机: ...

  2. 分布式搜索elasticsearch 索引文档的增删改查 入门

    分布式搜索elasticsearch 索引文档的增删改查 入门 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful ...

  3. 使用Qt创建XML文档及XML文档的增删改

    目录名字 使用Qt创建XML文档及XML文档的增删改 XML文档的操作 :QXml + QFile+QTextStream 创建XML的一般步骤: XML 文档的操作(添加.查找.更新.删除) 添加的 ...

  4. java jdom进行xml的增删改差_java使用DOM对XML文档进行增删改查操作实例代码

    本文研究的主要是java使用DOM对XML文档进行增删改查操作的相关代码,具体实例如下所示. 源代码: package com.zc.homeWork18; import java.io.File; ...

  5. MongoDB快速上手、windows安装、常用命令、文档基本增删改查、mongoDB的索引

    MongoDB快速上手 目标 理解MongoDB的业务场景.熟悉MongoDB的简介.特点和体系结构.数据类型等. 能够在Windows和Linux下安装和启动MongoDB.图形化管理界面Compa ...

  6. 1月16日学习内容整理:存储库MongoDB之文档的增删改查操作补充

    文档操作 一.查 1.比较运算 # SQL:=,!=,>,<,>=,<= # MongoDB:{key:value}代表什么等于什么,"$ne"," ...

  7. mongodb对数组元素及内嵌文档进行增删改查操作(转)

    from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...

  8. es内嵌文档查询_ElasticSearch 文档的增删改查都不会?

    本文主要是介绍 ElasticSearch 的文档增删改查和批量操作,同时会介绍一些 REST API 返回状态码的具体含义. 我们先来看下这个表: 这个表包含了 Index.Create.Read. ...

  9. 学生的新增mySQL文档_MySQL增删改查

    连接命令:mysql -h[主机地址] -u[用户名] -p[用户密码] 创建数据库:create database [库名] 显示所有数据库: show databases; 打开数据库:use [ ...

最新文章

  1. c++的:: . :-的区别
  2. Web前端学习有哪些技巧?
  3. c语言分支结构程序设计教学设计 赛课,《分支结构程序设计》教学设计.doc
  4. 行代码实现数据集可视化、分析与比较
  5. r软件linux 安装失败,R语言在Linux环境下安装Curl出错问题的解决
  6. C指针原理(3)-ATT汇编
  7. 前端学习(2081):三种方案对比es5没有闭包
  8. 《大数据》2015年第2期“研究”——大数据时代的数据传输网
  9. 考研 英语一 大作文-图画作文 (二)---第二段写作攻略
  10. 易经入门(体系最完整,推荐书目最完备,易经周易入门必收藏)
  11. PHP队列的实现,看完秒懂
  12. 根据旋转矩阵计算角度差
  13. matlab课程设计语音,语音伪装课程设计代码,求助
  14. 【Flume】Flume原理简述及示例实践
  15. 工业和信息化部办公厅关于深入推进移动物联网全面发展的通知
  16. 【工具】苏格拉底式诘问法解决工作问题
  17. 通过大规模机器学习自动调优数据库参数
  18. 一个好用的在线思维导图工具,拥有灵感快速画出精品思维导图
  19. 访问共享文件时遇到你没有权限访问请与管理员联系
  20. 双核心出口三层结构园区网配置(完整版)

热门文章

  1. 关于 惯导及其相关领域的一些术语解释
  2. 同步Overleaf, Github与本地latex文件
  3. 业务需求调研经验分享
  4. 2021-07-24 VMware workstation界面语言改为中文
  5. 115-545-003丨Alexa Fluor 488标记亲和纯化山羊抗小鼠IgG(H+L)二抗
  6. 企业级监控平台,监控系统选型
  7. 格局决定结局,态度决定高度
  8. 进程(父进程、子进程、init进程)
  9. 韦东山jz2440开发板重烧系统
  10. vue 根据后台提供的值判断登录、未登录状态