本篇介绍update/save两种方法提供的更新姿势
1. update
用于更新已经存在的文档,语法如下
1 | db.collection.update( |
- query: 查询条件
- update: 更新语句
- upsert: (可选)true, 不存在update的记录时插入;默认是false,不插入
- multi: (可选) true,表示更新所有满足条件的记录;默认false,只更新第一条
- writeConcern: (可选),抛出异常的级别
插入两条用于测试的数据
1 | db.doc_demo.insert({'name': '一灰灰', 'age': 19, 'skill': ['java', 'python', 'sql']}) |
下面给出几个更新的实例
更新age
1 | # 将name为"一灰灰"的文档age + 1 |
更新所有age为20的文档,新增一个tag成员
1 | db.doc_demo.update({'age': 20}, {$set: {'tag': 1}}, {multi:true}) |
更新一个不存在的文档
1 | db.doc_demo.update({'name': '一灰灰'}, {$set: {'age': 18, 'sex': 'man'}}, {upsert: true}) |
2. save
save最大的特点是覆盖,用新的文档完全覆盖旧的文档;而update,则是更新指定的field
语法如下:
1 | db.collection.save( |
举例如下
1 | db.doc_demo.save({'name': '一灰灰', 'age': 22, 'hobby': ['reading', 'walking']}) |
那么问题来了,怎样判定是新增一条记录,还是覆盖已经存在的记录呢?
- 有唯一键来判定
- 即:如果save的文档中,某个field有唯一性要求,那么当数据库中存在这个field文档文档时,执行覆盖操作;否则执行插入
举例如下, 指定ObjectId
1 | db.doc_demo.save({ "_id" : ObjectId("5e7b5c2e0172dc950171c48a"), "name" : "一灰灰New", "age" : 18, "hobby" : [ "play game" ] }) |
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog