我们前面讲MongoDB的CRUD操作讲过:MongoDB的更新操作通过集合的update()函数实现。这个函数有两个参数:要更改的文档和更改后的样子。要更新文档有两种情况:更新文档和对文档某些部分更新。下面分别说说这两种情况:

1.更新整个文档

假设现在有下面的一个文档:

  1. {"name":"zhangsan","dad":"zhangyi","mom":"lisi"};

如果觉得这样不好,需要讲父亲和母亲的信息组织到一起,成为一个新的文档:parents,另外,加上一个年龄字段age.那么新的文档如下:

  1. {"name":"zhangsan","age":20,"parents":{dad:"zhangyi","mom":"lisi"}};

如果要将数据库中的第一个文档替代为上面第二个文档,使用update操作的过程如下:

  1. > var zhangsan = db.info.findOne({"name" : "zhangsan"});
  2. > zhangsan
  3. {
  4. "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"),
  5. "name" : "zhangsan",
  6. "dad" : "zhangyi",
  7. "mom" : "lisi"
  8. }
  9. > zhangsan.parents={"dad":zhangsan.dad,"mom":zhangsan.mom};
  10. { "dad" : "zhangyi", "mom" : "lisi" }
  11. > zhangsan
  12. {
  13. "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"),
  14. "name" : "zhangsan",
  15. "dad" : "zhangyi",
  16. "mom" : "lisi",
  17. "parents" : {
  18. "dad" : "zhangyi",
  19. "mom" : "lisi"
  20. }
  21. }
  22. > zhangsan.age=20
  23. 20
  24. > zhangsan
  25. {
  26. "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"),
  27. "name" : "zhangsan",
  28. "dad" : "zhangyi",
  29. "mom" : "lisi",
  30. "parents" : {
  31. "dad" : "zhangyi",
  32. "mom" : "lisi"
  33. },
  34. "age" : 20
  35. }
  36. > delete zhangsan.dad
  37. true
  38. > zhangsan
  39. {
  40. "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"),
  41. "name" : "zhangsan",
  42. "mom" : "lisi",
  43. "parents" : {
  44. "dad" : "zhangyi",
  45. "mom" : "lisi"
  46. },
  47. "age" : 20
  48. }
  49. > delete zhangsan.mom
  50. true
  51. > zhangsan
  52. {
  53. "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"),
  54. "name" : "zhangsan",
  55. "parents" : {
  56. "dad" : "zhangyi",
  57. "mom" : "lisi"
  58. },
  59. "age" : 20
  60. }
  61. > db.info.update({"_id" : ObjectId("4ee37409c3fc1a9f80ad74ed")},zhangsan);
  62. > db.info.find();
  63. { "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"), "name" : "zhangsan", "parents" : { "dad" : "zhangyi", "mom" : "lisi" }, "age" : 20 }
  64. >

以这种方式进行文档更新需要注意一点:尽量通过_id来匹配需要被替换的文档。至于为什么,我想用过数据库的人应该都能明白(类似于用主键去匹配特性的记录)。

2.使用修改器部分修改文档的一部分

a) $set修改器

$set修改器指定一个键的新值,若不存在则创建新的。我们要给上面的zhangsan文档(数据库中的)添加一个wife键值对。

  1. > db.info.update({"_id" : ObjectId("4ee37409c3fc1a9f80ad74ed")},{"$set":{"wife":"wangwu"}});
  2. > db.info.find();
  3. { "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"), "age" : 20, "name" : "zhangsan", "parents" : { "dad" : "zhangyi", "mom" : "lisi" }, "wife" : "wangwu" }
  4. >

现在过了一年,张三已经是21岁了,那么可以使用$set更新age键的值:

  1. > db.info.update({"_id" : ObjectId("4ee37409c3fc1a9f80ad74ed")},{"$set":{"age":21}});
  2. > db.info.find();
  3. { "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"), "age" : 21, "name" : "zhangsan", "parents" : { "dad" : "zhangyi", "mom" : "lisi" }, "wife" : "wangwu" }
  4. >

当然这种情况还有别的修改器可以实现,并且更合适,我们一会会继续介绍。

zhangsan离婚了,没老婆了,怎们办?我们可以通过$unset修改器来撤销wife这个键值对。(PS:这个例子不是很合适,太残酷了)

  1. > db.info.update({"_id" : ObjectId("4ee37409c3fc1a9f80ad74ed")},{"$unset":{"wife":1}});
  2. > db.info.find();
  3. { "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"), "age" : 21, "name" : "zhangsan", "parents" : { "dad" : "zhangyi", "mom" : "lisi" } }
  4. >

b)$inc修改器

$inc修改器增加和修改已有键的值(只适用于数字类型)。上面我们提到,随着时间推移,zhangsan的年龄会不断增大,就可以使用这个修改器:

  1. > db.info.update({"_id" : ObjectId("4ee37409c3fc1a9f80ad74ed")},{"$inc":{"age":1}});
  2. > db.info.find();
  3. { "_id" : ObjectId("4ee37409c3fc1a9f80ad74ed"), "age" : 22, "name" : "zhangsan", "parents" : { "dad" : "zhangyi", "mom" : "lisi" } }
  4. >

这个修改器非常适合那些投票、计分、访问量统计一类的情况。但是得注意,这个选择器只适用于对数字类型的键值对进行增加和减少。减少只需要传递负值就可以了。

转载于:https://blog.51cto.com/wawlian/738952

MongoDB入门3——更新文档和修改器1相关推荐

  1. 《MongoDB入门教程》第14篇 CRUD之更新文档

    本篇我们将会介绍如何使用集合的 updateOne() 和 updateMany() 方法更新文档. updateOne() 方法 updateOne() 方法可以更新满足条件的单个文档,语法如下: ...

  2. MongoDB更新文档(非常详细,不要错过~)

    下面是对MongoDB更新数据库的整理,希望可以帮助到有需要的小伙伴~ 文章目录 更新文档 更新单个文档 更新多个文档 更新文档 更新单个文档 语法: User.updateOne({查询条件},{要 ...

  3. MongoDB——文档操作(更新文档)

    目录 一.更新文档命令的格式 二.更新操作符 三.更新单个文档 3.1.更新单个文档的示例 四.更新多个文档 4.1.更新多个文档的概述 4.2.更新多个文档的示例 五.使用upsert命令 5.1. ...

  4. mongodb更新文档

    mongodb更新文档 方法一:直接修改 语法:db.集合名.update({条件},{新的文档}) db.php333.update({num:214},{num:1114444}); 注意:出现的 ...

  5. 开启MongoDB更新文档操作的正确姿势

    将文档存入数据库中之后,可以使用以下几种更新方法之一对其进行更改:updateOne.updateMany 和 replaceOne.updateOne 和 updateMany 都将筛选文档作为第一 ...

  6. MongoDB(5)文档 CRUD 操作

    MongoDB 入门专栏 http://blog.csdn.net/column/details/19681.html MongoDB 文档 CRUD 操作 查询文档 基本使用 mongodb 查询文 ...

  7. 魔坊APP项目-11-PyMongo、数据库连接,管理、集合管理、文档管理(添加文档、查询文档、删除文档、更新文档)

    PyMongo 安装: pip install pymongo 一.数据库连接 数据库连接,无密码 from pymongo import MongoClient# 数据库链接,必须保证当前系统能正常 ...

  8. php solr 更新数据类型,Solr更新文档数据

    使用XML更新文档 以下是用于更新现有文档中的字段的XML文件.将下面的内容保存在名称为update.xml的文件中. 001 Raj Malhotra 9000000000 Delhi 正如上面看到 ...

  9. Facebook 游戏开发更新文档 API 参考文档 v6.0

    Facebook 游戏开发更新文档 API 参考文档 v6.0 更新日志 1.排行榜 此版本全新推出排行榜 API!提供一套强大的 API, 使得游戏可获取排行榜.查询得分 情况和设置新分数(支持分数 ...

  10. 【elasticsearch】如何部分更新文档 (partial update的使用)

    文章目录 1.什么是partial update 1.1 全量修改文档的原理 1.2 修改指定field的思路 1.3 partial update的优势 1.4 partial update的使用 ...

最新文章

  1. vivado----fpga硬件调试 (七)----数据导出并用MATLAB读取
  2. nodejs入门教程之http的get和request简介及应用
  3. Linux中文档去掉windows文本的多余的回车符(^M)
  4. 无线路由器在手机上如何连接服务器,192.168.10.1路由器手机怎么设置? | 192路由网...
  5. 字节跳动学前端还是java_【全国】—Java/前端工程师—字节跳动
  6. 当使用 position 属性时,请始终设置 !DOCTYPE 声明:当使用 float 属性时,请始终设置 !DOCTYPE 声明:
  7. 苹果电脑删除linux系统软件,mac删除双系统_mac删除双系统的win
  8. 基于FPGA的CameraLink视频开发案例
  9. HCRM医院客户管理系统
  10. Android端实现下载抖音直播视频功能
  11. Vue3和Vue2的一些区别
  12. Python 他来了,他来了!
  13. EasyCVR添加萤石云SDK接入的设计与开发流程
  14. 联想笔记本进入pe_联想小新笔记本怎么进入bios设置U盘启动
  15. GIC spec之ITS和LPI中断3
  16. pdf 模版 汉字和数字_标准格式!田字格里如何写汉字和数字(强烈推荐收藏)...
  17. 用格里高利公式求给定精度的PI值 (15分)
  18. 1027: 伊顿公学进入名校人数第2题(2级)输入两个用空格分隔的整数m和n,分别表示某年的毕业生人数和该年度进入某名校的百分比。输出输出一个整数count,表示该年度进入该名校的学生人数
  19. vue实现带节假日的日历
  20. [含LW+辩论PPT+任务书+中期检查表+源码等]javaweb企业员工信息管理系统的设计与实现薪酬|请假|薪资|工资[包运行成功]计算机毕业设计Java项目

热门文章

  1. 计算机课初中文化的学生招,我是一名初中信息技术教师,有时候想在理论课上讲..._教师招聘考试_帮考网...
  2. sqli-labs-master sql注入靶场(10、11、12)
  3. Hive on Tez map阶段task划分源码分析(map task个数)
  4. 中创向心力:职业教育改革实施新方案
  5. android 界面设计基本知识Ⅲ
  6. 【软件周刊第 33 期】跳票 5 次的 Fedora 26 Beta 终发布 坐等正式版
  7. 【c语言】5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
  8. 【爆笑趣图】攻城狮面试合集
  9. Xcode9下自动化编译错误
  10. 基于word2vec与Word Mover Distance的文档相似度计算