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的文档,其结果无任何文档返回,因为已经被更新