首页 > mongodb > basic > 17.MongoDB修改数据

17.MongoDB修改数据

1 MongoDB修改操作

db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <replacement>, <options>)

2 初始化数据

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
]);

3 MongoDB修改数据格式

MongoDB中可以通过update operters, 例如: $set等, 来修改数据.

MongoDB的update修改格式:

{
  <update operator>: { <field1>: <value1>, ... },
  <update operator>: { <field2>: <value2>, ... },
  ...
}

4 MongoDB修改集合中的一条数据

以下例子通过db.collection.updateOne()方法来修改inventory集合中第一条满足item值等于paper的数据.

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

MongoDB update操作介绍:

  • $set操作符来修改size.uom字段为cm, 并且将status改为P.
  • $currentDate操作符修改lastModified字段值为当前时间. 如果lastModified字段不存在, 将会自动创建一个.

5 修改多条文档

3.2版本新特性

以下示例使用db.collection.updateMany()方法来修改inventory集合中qty小于50的全部文档.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

6 MongoDB替换数据

通过db.collection.replaceOne()方法来替换除_id字段外其余的值. 第二个参数为新的文档数据.执行替换操作时, 需要替换的文档数据中只能包括键值对, 不能包含修改操作符.替换文档数据数据格式可以和以前不一样. 可以省略_id字段,因为这个字段值是不可修改的. 如果包含这个值需要和以前的值一样.

替换代码示例:

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

7 修改行为

7.1 MongoDB修改的原子性

MongoDB中所有写的操作都是文档级的原子性.

7.2 MongoDBz的_id字段

_id字段一旦设定无法修改, 也不能通过替换方法修改.

7.3 文档数据大小

当执行update操作时文档数据大小超过给那个分配的大小时, 会将这个文档重新定位到硬盘中.

7.4 字段顺序

MongoDB执行写的操作时保留文档中的字段顺序, 除了以下例外:

  • _id字段始终是第一个
  • 更新已有字段数据, 会导致字段重新排序

MonogoDB2.6修改. Mongodb2.6之前不能主动保持字段在文档数据中的数据.

8 MongoDB插入操作

updateOne(), updateMany(), 和replaceOne()这几个操作如果包含了"upsert : true"时, 如果没有满足指定条件的文档存在, 则自动插入新的数据.

9 MongoDB写回执

你可以自定义Mongodb写操作的回执等级. 详情查阅Write Concern.

10 参考文章

https://docs.mongodb.com/manual/tutorial/update-documents/

11 相关文章

MongoDB中文文档

转载请保留原文链接.