八:文档 Document 更新姿势

一灰灰blogDBMongoMongoDb约 477 字大约 2 分钟

本篇介绍update/save两种方法提供的更新姿势

1. update

用于更新已经存在的文档,语法如下

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
  • query: 查询条件
  • update: 更新语句
  • upsert: (可选)true, 不存在update的记录时插入;默认是false,不插入
  • multi: (可选) true,表示更新所有满足条件的记录;默认false,只更新第一条
  • writeConcern: (可选),抛出异常的级别

插入两条用于测试的数据

db.doc_demo.insert({'name': '一灰灰', 'age': 19, 'skill': ['java', 'python', 'sql']})
db.doc_demo.insert({'name': '一灰灰blog', 'age': 20, 'skill': ['web', 'shell', 'js']})

下面给出几个更新的实例

更新age

# 将name为"一灰灰"的文档age + 1
db.doc_demo.update({'name':'一灰灰'}, {$inc: {'age': 1}})
# 修改name
db.doc_demo.update({'name':'一灰灰'}, {$set: {'name': '一灰灰Blog'}})

更新所有age为20的文档,新增一个tag成员

db.doc_demo.update({'age': 20}, {$set: {'tag': 1}}, {multi:true})

更新一个不存在的文档

db.doc_demo.update({'name': '一灰灰'}, {$set: {'age': 18, 'sex': 'man'}}, {upsert: true})

2. save

save最大的特点是覆盖,用新的文档完全覆盖旧的文档;而update,则是更新指定的field

语法如下:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

举例如下

db.doc_demo.save({'name': '一灰灰', 'age': 22, 'hobby': ['reading', 'walking']})

那么问题来了,怎样判定是新增一条记录,还是覆盖已经存在的记录呢?

  • 有唯一键来判定
  • 即:如果save的文档中,某个field有唯一性要求,那么当数据库中存在这个field文档文档时,执行覆盖操作;否则执行插入

举例如下, 指定ObjectId

db.doc_demo.save({ "_id" : ObjectId("5e7b5c2e0172dc950171c48a"), "name" : "一灰灰New", "age" : 18, "hobby" : [ "play game" ] })
Loading...