八:文档 Document 更新姿势
约 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...