本文共 3618 字,大约阅读时间需要 12 分钟。
MongoDB 是一个基于 CRUD 操作的文档存储系统,能够对集合中的文档进行增删改查。集合上的字段增删改可以通过多种方式实现,包括使用 set
或 unset
修改器,或者通过文档替换的方式。本文将详细介绍集合上字段的增删改,以及基于选项 upsert
的更新操作。
db.collection.update()
方法的语法格式如下:
db.collection.update(, // 查询或过滤条件 , // 修改器(被修改键及内容) { upsert: , // true 表示匹配不到文档则创建新文档 multi: , // true 表示更新所有匹配文档 writeConcern: // 确定写关注类型,用于强一致性或弱一致性 })
$set
修改器修改年龄字段以下命令可以通过 update
方法修改文档中 年龄
字段:
db.chenji.update({ name: "李旭" }, { $set: { 年龄: 24 } })
执行后,查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "name": "李旭", "年纪": "三年级", "年龄": 24}
以下命令可以在文档中添加新字段:
db.chenji.update({ name: "李旭" }, { $set: { add: "性别" } })
执行后,查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "name": "李旭", "年纪": "三年级", "年龄": 24, "add": "性别"}
字段的删除可以通过 unset
修改器实现:
db.chenji.update({ name: "李旭" }, { $unset: { add: 1 } })
执行后,查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "name": "李旭", "年纪": "三年级", "年龄": 24}
$inc
修改器用于对数值字段进行增减操作。若字段不存在,会自动创建该字段;若字段存在,则在原值基础上操作。
db.chenji.update({ name: "李旭" }, { $inc: { num: 100 } })
执行后,查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "name": "李旭", "年纪": "三年级", "年龄": 24, "num": 100}
再次执行相同操作:
db.chenji.update({ name: "李旭" }, { $inc: { num: 101 } })
查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "name": "李旭", "年纪": "三年级", "年龄": 24, "num": 201}
$currentDate
修改器用于自动更新文档的时间戳字段。以下命令可以同时增加字段值和更新时间戳:
db.chenji.update({ name: "李旭" }, { $inc: { num: 60 }, $currentDate: { lastModified: true } })
执行后,查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "name": "李旭", "年纪": "三年级", "年龄": 24, "num": 231, "lastModified": ISODate("2017-08-20T08:39:53.601Z")}
$rename
修改器用于重命名文档字段。以下命令可以将 name
字段重命名为 ename
:
db.chenji.update({ name: "李旭" }, { $rename: { name: "ename" } })
执行后,查询结果如下:
db.chenji.find({ $or: [{ name: "李旭" }] }).pretty()
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "age": 9, "年级": "一年级", "num": 231, "lastModified": ISODate("2017-08-20T08:39:53.601Z"), "ename": "李旭"}
以下命令可以将所有文档中的 name
字段重命名为 ename
:
db.chenji.update({}, { $rename: { name: "ename" } }, { multi: true })
执行后,查询结果如下:
db.chenji.find().pretty()
{ "_id": ObjectId("59990ec402730a37fe1ee79e"), "年纪": "二年级", "年龄": "12", "ename": "建伟"}
{ "_id": ObjectId("59987eee7cd6cda607043cd1"), "age": 9, "年级": "一年级", "num": 231, "lastModified": ISODate("2017-08-20T08:39:53.601Z"), "ename": "李旭"}
{ "_id": ObjectId("5998860a7cd6cda607043cd2"), "年纪": "三年级", "年龄": "14", "ename": "张三"}
{ "_id": ObjectId("599886227cd6cda607043cd3"), "年纪": "四年级", "年龄": "16", "ename": "王三"}
{ "_id": ObjectId("599886357cd6cda607043cd4"), "年纪": "一年级", "年龄": "8", "ename": "王七"}
{ "_id": ObjectId("599886537cd6cda607043cd5"), "年纪": "一年级", "年龄": "9", "ename": "张巴"}
{ "_id": ObjectId("5998866e7cd6cda607043cd6"), "年纪": "七年级", "年龄": "16", "ename": "谢娜"}
upsert
选项的作用类似于 Oracle 的 merge into
或 MySQL 的 replace into
。当 upsert: true
时,若集合中匹配到满足条件的文档,则更新文档内容;否则,创建新文档。默认值为 false
。
$set
和 $inc
修改器。$inc
是一种高效的数据修改器,通常用于实现数值的增加或减少,仅支持数字类型。$set
、$unset
、$inc
等方式实现。upsert
选项可以实现“匹配则更新,不匹配则插入”的功能。转载地址:http://hcffk.baihongyu.com/