千家信息网

MongoDB中修改器的使用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,再使用Mongodb的过程中,通常文档都会只有一部分需要更新,可以使用MongoDB中原子性的更新修改器。更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加或者删除键,还可能是操作数组或者
千家信息网最后更新 2026年11月01日MongoDB中修改器的使用

再使用Mongodb的过程中,通常文档都会只有一部分需要更新,可以使用MongoDB中原子性的更新修改器。更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加或者删除键,还可能是操作数组或者内嵌文档。


(1)$inc : 用于增加已有键的值,或者该键不存在那就创建一个。

假设一个集合中保存了网站的分析数据,里面有页面的点击量。要求每点击一次,页面点击量就增加1,可以使用"$inc"来实现。

> db.site.findOne()
{
"_id" : ObjectId("589bc80fd856931885c3dc40"),
"url" : "www.example.com",
"pageviews" : 55
}

每次有人访问页面,就通过URL找到该页面,并用"$inc"修改器增加"pageviews"的值。

> db.site.update({"url":"www.example.com"},{"$inc":{"pageviews":1}})

现在,执行一个find操作就可以发现"pageviews"的值增加了1。

> db.site.findOne()
{
"_id" : ObjectId("589bc80fd856931885c3dc40"),
"url" : "www.example.com",
"pageviews" : 56
}


注意:使用修改器的时候,"_id"的值不能改变(注意,整个文档替换的时候可以改变"_id")。其他键值,包括其他唯一索引的键,都是可以改变的。

"$inc"键的值必须为数字,不能使用字符串、数组或其他非数字的值。


(2)$set:用来指定一个字段的值。如果这个字段不存在,则创建它。这对更新模式或者增加用户定义的键来说非常方便。

实例:用户资料存储在下面的文档中:

> db.user.findOne()
{
"_id" : ObjectId("589bcbe3d856931885c3dc41"),
"age" : 30,
"location" : "xi'an",
"name" : "joe",
"sex" : "male"
}
如果要增加用户喜欢的书籍进去,可以使用"$set"实现:

> db.user.update({"_id" : ObjectId("589bcbe3d856931885c3dc41")},{"$set":{"favorite book":"war and peace"}})

现在,执行一个find操作就可以发现已经有"favorite book"这个键了。

> db.user.findOne()
{
"_id" : ObjectId("589bcbe3d856931885c3dc41"),
"age" : 30,
"favorite book" : "war and peace",
"location" : "xi'an",
"name" : "joe",
"sex" : "male"
}

"$set"也可以修改键的值。如果用户喜欢的书变成另外一本了,则可以使用"$set"修改:

> db.user.update({"_id" : ObjectId("589bcbe3d856931885c3dc41")},{"$set":{"favorite book":"Green Eggs and Ham"}})
> db.user.findOne()
{
"_id" : ObjectId("589bcbe3d856931885c3dc41"),
"age" : 30,
"favorite book" : "Green Eggs and Ham",
"location" : "xi'an",
"name" : "joe",
"sex" : "male"
}


"$set"甚至可以修改键的类型。比如,用户喜欢的书籍有很多本,则可以将"favorite book"键的值变成一个数组:

> db.user.update({"name":"joe"},{"$set":{"favorite book":["cat's cradle","foudation trilogy","ender's name"]}})
> db.user.findOne()
{
"_id" : ObjectId("589bcbe3d856931885c3dc41"),
"age" : 30,
"favorite book" : [
"cat's cradle",
"foudation trilogy",
"ender's name"
],

"location" : "xi'an",
"name" : "joe",
"sex" : "male"
}


(3) $unset: 删除键

如果用户突然发现自己其实不喜欢读书,可以使用"$unset"将这个键完全删除:

> db.user.update({"name":"joe"},{"$unset":{"favorite book":1}})
> db.user.findOne()
{
"_id" : ObjectId("589bcbe3d856931885c3dc41"),
"age" : 30,
"location" : "xi'an",
"name" : "joe",
"sex" : "male"
}


$set也可以修改内嵌文档:

> db.blog.posts.find()
{

"_id" : ObjectId("589bdb7ed856931885c3dc42"),

"title" : "A blog post",

"content" : "blog text",

"author" : {

"name" : "joe",

"email" : "joe@example.com"

}

}


> db.blog.posts.update({"author.name":"joe"},{"$set":{"author.name":"zhangyahui"}})


> db.blog.posts.findOne()
{
"_id" : ObjectId("589bdb7ed856931885c3dc42"),
"author" : {
"email" : "joe@example.com",
"name" : "zhangyahui"
},
"content" : "blog text",
"title" : "A blog post"
}

增加、修改或者删除键的时候,应该使用$修改器。


(4)$push: 会想已有的数组末尾加入一个元素,要是没有就创建一个新的数组。

> db.blog.posts.findOne()
{
"_id" : ObjectId("589bdb7ed856931885c3dc42"),
"author" : {
"email" : "joe@example.com",
"name" : "zhangyahui"
},
"content" : "blog text",
"title" : "A blog post"
}

> db.blog.posts.update({"title" : "A blog post"},{"$push":{"comments":{"name":"joe","email":"joe@example.com","content":"nice post"}}})
> db.blog.posts.findOne()
{
"_id" : ObjectId("589bdb7ed856931885c3dc42"),
"author" : {
"email" : "joe@example.com",
"name" : "zhangyahui"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post"
}
],

"content" : "blog text",
"title" : "A blog post"
}
要是还想添加一条评论,继续使用"$push"。

(5)$each: 使用"$each"子操作符,可以通过一次"$push"操作添加多个值:

> db.blog.posts.findOne()
{
"_id" : ObjectId("589bdb7ed856931885c3dc42"),
"author" : {
"email" : "joe@example.com",
"name" : "zhangyahui"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post"
}
],
"content" : "blog text",
"hourly" : [
543
],
"title" : "A blog post"
}
> db.blog.posts.update({"title" : "A blog post"},{"$push":{"hourly":{"$each":[562.776,562.790,559.123]}}})
> db.blog.posts.findOne()
{
"_id" : ObjectId("589bdb7ed856931885c3dc42"),
"author" : {
"email" : "joe@example.com",
"name" : "zhangyahui"
},
"comments" : [
{
"name" : "joe",
"email" : "joe@example.com",
"content" : "nice post"
}
],
"content" : "blog text",
"hourly" : [
543,
562.776,
562.79,
559.123
],

"title" : "A blog post"
}


用户 修改器 数组 文档 更新 页面 时候 书籍 字段 数字 要是 复杂 特殊 元素 原子 只有 可以通过 多个 字符 字符串 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 亿人帮互联网科技有限公司 广州大一互联网络科技有限公司 蓝思科技飞鸽互联网 科技股互联网 上海互联网科技有限公司 杭州互联网科技公司 互联网科技小额贷款 甘肃拓世互联网科技有限公司 须眉科技是互联网公司吗 互联网科技与大数据专业 乌苏新华互联网科技做什么的 互联网科技创新的路径 厦门江牛科技互联网 互联网科技股为什么大涨 第三届互联网大会安防黑科技 互联网对科技影响 上海互联网科技园景观 恒生科技互联网指数十大成分股 山东亿川互联网科技有限责任公司 中智农互联网科技 关于新基建和互联网科技 互联网科技与金融科技 上海挚品互联网科技 互联网大会黑科技排名 玉溪新华互联网科技好不好 工业互联网等科技实现智能化赋能 广州智享互联网科技 北京军民互联网科技公司 保山浩联互联网科技有限公司
0