打破
精准点评纠偏,逻辑框架助力创业闭环,reasoning_content:我们要求以前端开发者的口吻,写一个与“技术、科技”相关,关于[精准点评纠偏,逻辑框架助力,创业构建高效闭环]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以结合前端开发者的视角,比如提到代码、框架、调试、闭环等关键词:精准点评纠偏(类似代码review或debug)、逻辑框架(前端的框架如React/Vue等)、创业构建高效闭环(创业中的高效迭代)nn可能的用框架思维纠偏,创业闭环更高效或者前端视角:精准点评拆解逻辑,创业闭环加速但需要更简洁nn尝试:精准点评纠偏,逻辑框架助力创业闭环但字数可能超?数一下:精准点评纠偏,逻辑框架助力创业闭环——共14字,可以但需要体现前端开发者口吻,可以加个“前端”或“代码”?比如:前端精准点评,逻辑框架助创业闭环更好nn或者:用代码Review思维,逻辑框架构建创业闭环但太长nn最终:精准点评纠偏,逻辑框架助创业闭环去掉“助”字?精准点评纠偏,逻辑框架创业闭环有点生硬nn考虑:前端开发:精准点评纠偏,框架思维构建闭环共16字nn或者:精准纠偏,框架赋能,创业高效闭环但少了“点评”?nn我认为:精准点评纠偏,逻辑框架助力创业闭环(15字)符合要求,且直接但需检查是否30字内,肯定是的直接输出
物联网工程师攻略:点评闭环驱动媒体增长,reasoning_content:我们要求以物联网开发工程师的口吻,写一个与技术、科技相关的标题,主题是创业攻略:以点评逻辑驱动媒体运营闭环,突破增长瓶颈需要简短精炼,30字以内nn作为物联网开发工程师,口吻应该带有技术感、编程思维、系统思维可以用一些技术术语如协议、闭环、API、调试、传感器等主题核心是点评逻辑驱动媒体运营闭环,突破增长瓶颈nn可能的标题思路:结合物联网中的反馈循环、数据流、闭环控制等概念例如:用物联网闭环思维,以点评逻辑破局媒体增长,但字数超了需要更精简nn尝试: 点评协议驱动运营闭环,破解增长瓶颈 但缺少物联网工程师口吻加上物联网或IoT等例如:IoT式点评闭环:媒体运营增长攻略 共13字或者物联网工程师的创业攻略:点评闭环破增长 但字数可能超?物联网工程师的创业攻略:点评闭环破增长 共18字,符合nn更简洁:点评闭环+物联网思维,突破增长瓶颈 13字?点评闭环+物联网思维,突破增长瓶颈 14字或者用点评逻辑打造媒体运营闭环,物联网工程师教你突破增长 太长nn最合适: 物联网工程师攻略:点评闭环驱动媒体增长 共18字或者点评逻辑+物联网闭环,突破增长瓶颈 13字注意不要加说明直接输出一个标题nn我选:点评协议驱动媒体运营闭环,破增长瓶颈 但协议有点生硬更好:IoT点评闭环:媒体运营增长攻略 共12字或者物联网开发工程师:点评闭环破增长瓶颈 共16字nn考虑到口吻,可以用程序员或开发者但指定了物联网开发工程师最终输出一个标题我决定用:物联网开发工程师:用点评闭环逻辑破媒体增长 共18字或者更精炼:点评闭环+物联网思维,突破增长 12字但突破增长不够完整nn为了更符合创业攻略,可以加攻略二字 物联网工程师攻略:点评闭环驱动媒体增长 18字直接输出
15 9 月 2026, 周二

这篇文章主要讲解了“MongoDB文档的更新操作及过程是怎样”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB文档的更新操作及过程是怎样”吧!

在MongoDB中,更新单个doc的操作是原子性的。默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的doc更新成功,而后面的doc更新失败的情况。由于更新单个doc的操作是原子性的,如果两个更新同时发生,那么一个更新操作会阻塞另外一个,doc的最终结果值是由时间靠后的更新操作决定的。

我们在前面的文章中提到过文档的基本的增删改查操作,MongoDB中提供的增删改查的语法非常丰富

文档替换
假设我的集合中现在存了如下一段数据:

{
 "_id" : ObjectId("59f005402844ff254a1b68f6"),
 "name" : "三国演义",
 "authorName" : "罗贯中",
 "authorGender" : "男",
 "authorAge" : 99.0
}
这是一本书,有书名和作者信息,但是作者是一个独立的实体,所以我想将之提取出来,变成下面这样:

{
 "_id" : ObjectId("59f005402844ff254a1b68f6"),
 "name" : "三国演义",
 "author" : {
 "name" : "罗贯中",
 "gender" : "男",
 "age" : 99.0
 }
}
我可以采用如下操作:

另外一个问题是更新时,MongoDB只会匹配第一个更新的文档,假设我的MongoDB中有如下数据:

{ "_id" : ObjectId("59f00d4a2844ff254a1b68f7"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f8"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f9"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68fa"), "x" : 2 }
我想把所有x为1的数据改为99,我们很容易想到如下命令:

db.sang_collect.update({x:1},{x:99})
但我们发现执行结果却是这样:

{ "_id" : ObjectId("59f00d4a2844ff254a1b68f7"), "x" : 99 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f8"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f9"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68fa"), "x" : 2 }
即只有第一条匹配的结果被更新了,其他的都没有变化。这是MongoDB的更新规则,即只更新第一条匹配结果。如果我们想将所有x为1的更新为x为99,可以采用如下命令:

db.sang_collect.update({x:1},{$set:{x:99}},false,true)
首先我们将要修改的数据赋值给$set,$set是一个修改器,我们将在下文详细讲解,然后后面多了两个参数,第一个false表示如果不存在update记录,是否将我们要更新的文档作为一个新文档插入,true表示插入,false表示不插入,默认为false,第二个true表示是否更新全部查到的文档,false表示只更新第一条记录,true表示更新所有查到的文档。

数组修改器
数组修改器有好几种,我们分别来看。
$push可以向已有数组末尾追加元素,要是不存在就创建一个数组,还是以我们的上面的book为例,假设book有一个字段为comments,是一个数组,表示对这个book的评论,我们可以使用如下命令添加一条评论:

db.sang_collect.update({name:"三国演义"},{$push:{comments:"好书666"}})
此时不存在comments字段,系统会自动帮我们创建该字段,结果如下:

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "好书666"
 ]
}
此时我们可以追加评论,如下:

db.sang_collect.update({name:"三国演义"},{$push:{comments:"好书666啦啦啦啦"}})
结果如下:

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "好书666", 
 "好书666啦啦啦啦"
 ]
}
如果想一次添加3条评论,可以结合$each一起来使用,如下:

db.sang_collect.update({name:"三国演义"},{$push:{comments:{$each:["111","222","333"]}}})
结果如下:

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "好书666", 
 "好书666啦啦啦啦", 
 "111", 
 "222", 
 "333"
 ]
}
我们可以使用$slice来固定数组的长度,假设我固定数组的长度为5,如果数组中的元素不足5个,则全部保留,如果数组中的元素超过5个,则只会保留最新的5个,如下:

db.sang_collect.update({name:"三国演义"},{$push:{comments:{$each:["444","555"],$slice:-5}}})
注意:$slice的值为负数,运行结果如下:

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "111", 
 "222", 
 "333", 
 "444", 
 "555"
 ]
}
我们还可以在清理之前使用$sort对数据先进行排序,然后再清理比如我有一个class文档,如下:

{
 "_id" : ObjectId("59f07f3649fc5c9c2412a662"),
 "class" : "三年级二班"
}
现在向这个文档中插入student,每个student有姓名和成绩,然后按照成绩降序排列,只要前5条数据,如下:

db.sang_collect.update({class:"三年级二班"},{$push:{students:{$each:[{name:"张一百",score:100},{name:"张九九",score:99},{name:"张九八",score:98}],$slice:5,$sort:{score:-1}}}})
$sort的取值为-1和1,-1表示降序,1表示升序。
上面的命令执行两次之后(即插入两次),结果如下:

{
 "_id" : ObjectId("59f07f3649fc5c9c2412a662"),
 "class" : "三年级二班",
 "students" : [ 
 {
  "name" : "张一百",
  "score" : 100.0
 }, 
 {
  "name" : "张一百",
  "score" : 100.0
 }, 
 {
  "name" : "张九九",
  "score" : 99.0
 }, 
 {
  "name" : "张九九",
  "score" : 99.0
 }, 
 {
  "name" : "张九八",
  "score" : 98.0
 }
 ]
}
$slice和$sort不能只和$push一起使用,还要加上$each。

$addToSet
我们可以在插入的时候使用$addToSet,表示要插入的值如果存在则不插入,否则插入,如下:

db.sang_collect.update({name:"三国演义"},{$addToSet:{comments:"好书"}})
上面的命令执行多次之后,发现只成功插入了一条数据。也可以将$addToSet和$each结合起来使用,如下:

db.sang_collect.update({name:"三国演义"},{$addToSet:{comments:{$each:["111","222","333"]}}})
$pop
$pop可以用来删除数组中的数据,如下:

db.sang_collect.update({name:"三国演义"},{$pop:{comments:1}})
1表示从comments数组的末尾删除一条数据,-1表示从comments数组的开头删除一条数据。

$pull
使用$pull我们可以按条件删除数组中的某个元素,如下:

db.sang_collect.update({name:"三国演义"},{$pull:{comments:"444"}})
表示删除数组中值为444的数据。

$

既然是数组,我们当然可以通过下标来访问,如下一行操作表示将下标为0的(第一个comments)comments修改为999:

db.sang_collect.update({name:"三国演义"},{$set:{"comments.0":"999"}})
可是有的时候我并不知道我要修改的数据处于数组中的什么位置,这个时候可以使用$符号来解决:

db.sang_collect.update({comments:"333"},{$set:{"comments.$":"333-1"}})
查询条件查出来333的下标,$符号就代码这个下标,然后通过$符号就能将之修改。

save
save是shell中的一个函数,接收一个参数,这个参数就是文档,如果文档中有_id参数save会执行更新操作,否则执行插入操作,使用save操作我们可以方便的完成一些更新操作。

类似于如下命令则表示一个插入操作(因为没有_id):

db.sang_collect.save({x:111})
好了,MongoDB的更新操作我们就先介绍这么多,有问题欢迎留言讨论。

上述内容具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助。

dawei

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

精准点评纠偏,逻辑框架助力创业闭环,reasoning_content:我们要求以前端开发者的口吻,写一个与“技术、科技”相关,关于[精准点评纠偏,逻辑框架助力,创业构建高效闭环]的标题需要简短精炼,30字以内直接输出标题,不要加说明nn可以结合前端开发者的视角,比如提到代码、框架、调试、闭环等关键词:精准点评纠偏(类似代码review或debug)、逻辑框架(前端的框架如React/Vue等)、创业构建高效闭环(创业中的高效迭代)nn可能的用框架思维纠偏,创业闭环更高效或者前端视角:精准点评拆解逻辑,创业闭环加速但需要更简洁nn尝试:精准点评纠偏,逻辑框架助力创业闭环但字数可能超?数一下:精准点评纠偏,逻辑框架助力创业闭环——共14字,可以但需要体现前端开发者口吻,可以加个“前端”或“代码”?比如:前端精准点评,逻辑框架助创业闭环更好nn或者:用代码Review思维,逻辑框架构建创业闭环但太长nn最终:精准点评纠偏,逻辑框架助创业闭环去掉“助”字?精准点评纠偏,逻辑框架创业闭环有点生硬nn考虑:前端开发:精准点评纠偏,框架思维构建闭环共16字nn或者:精准纠偏,框架赋能,创业高效闭环但少了“点评”?nn我认为:精准点评纠偏,逻辑框架助力创业闭环(15字)符合要求,且直接但需检查是否30字内,肯定是的直接输出

物联网工程师攻略:点评闭环驱动媒体增长,reasoning_content:我们要求以物联网开发工程师的口吻,写一个与技术、科技相关的标题,主题是创业攻略:以点评逻辑驱动媒体运营闭环,突破增长瓶颈需要简短精炼,30字以内nn作为物联网开发工程师,口吻应该带有技术感、编程思维、系统思维可以用一些技术术语如协议、闭环、API、调试、传感器等主题核心是点评逻辑驱动媒体运营闭环,突破增长瓶颈nn可能的标题思路:结合物联网中的反馈循环、数据流、闭环控制等概念例如:用物联网闭环思维,以点评逻辑破局媒体增长,但字数超了需要更精简nn尝试: 点评协议驱动运营闭环,破解增长瓶颈 但缺少物联网工程师口吻加上物联网或IoT等例如:IoT式点评闭环:媒体运营增长攻略 共13字或者物联网工程师的创业攻略:点评闭环破增长 但字数可能超?物联网工程师的创业攻略:点评闭环破增长 共18字,符合nn更简洁:点评闭环+物联网思维,突破增长瓶颈 13字?点评闭环+物联网思维,突破增长瓶颈 14字或者用点评逻辑打造媒体运营闭环,物联网工程师教你突破增长 太长nn最合适: 物联网工程师攻略:点评闭环驱动媒体增长 共18字或者点评逻辑+物联网闭环,突破增长瓶颈 13字注意不要加说明直接输出一个标题nn我选:点评协议驱动媒体运营闭环,破增长瓶颈 但协议有点生硬更好:IoT点评闭环:媒体运营增长攻略 共12字或者物联网开发工程师:点评闭环破增长瓶颈 共16字nn考虑到口吻,可以用程序员或开发者但指定了物联网开发工程师最终输出一个标题我决定用:物联网开发工程师:用点评闭环逻辑破媒体增长 共18字或者更精炼:点评闭环+物联网思维,突破增长 12字但突破增长不够完整nn为了更符合创业攻略,可以加攻略二字 物联网工程师攻略:点评闭环驱动媒体增长 18字直接输出