开发者学堂课程【快速掌握 MongoDB 数据库:更新函数】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/400/detail/5192
更新函数
对于 MongoDB 而言,数据的更新基本上是一件很麻烦的事情,如果在实际的工作之中,真的具有此类的操作支持,记住,mongo 数据保存的是副本数据。
但是 mango 在设计的时候尽可能不想让它作为副本设计,最终的数据还是要保存在传统的关系型数据库里,但是 mango 就觉得应该存自己的数据。
但是从实际应用效果而言,一定是关系型数据库保存数据最好,如果关系型数据库保存的数据被变更了那么把 mango 的数据删掉重新插就可以了。
那么最好的做法:在 MongoDB 里面对于数据的更新操作提供了两类函数:
save
( )
update
( )
函数的基本使用
如果要修改数据最直接的使用函数就是 update()函数,但是这个函数的语法要求很麻烦:
语法: db.集合.update(更新条件,新的对象数据(更新操作符) ,upsert , multi);
-upsert:如果要更新的数据不存在, 则增加一条新的内容(true为增加、false 为不增加)
-multi:表示是否只更新满足条件的第一行记录,如果设置为 false,只更新第一条,如果是 true 全更新。
首先先写入:
db.students.find () .skip(0) .limit(5).sort( { "$natual"
:1
}).
pretty();
执行找出信息:
_id": objectId("5594ab1eeecd74894d19fff2""),
"name"
: 张三",
"sex" :
“男,
"age”
: 19,
score"
: 59
"address":
“海淀区"
" _id" : objectId("5594ab1eeecd74894d19fff3""),
"name":
“李四”,
“
sex" :
“女”,
"age"" :
20,
“
score” :
59,_
“
address" :
朝阳区"
"_id": objectId("5594ab1eeecd74894d19fff4""),
"name":
"王五",
"sex” :
“女”,
"age""
: 19,
“
score"
: 99 ,
"address""
:“西城区"
可以看到19岁的现在成绩都不是100
范例:将年龄是19岁的人的成绩都更新为100分(此时会返回多条数据)
如果是 true,不存在则增加,如果是 false则不增加。
l 只更新第一条数据:
db.students.update( { "age" : 19} , {"$set" :
{ "score":100} },false,false) ;
19岁成绩变化,注意成绩变化不能直接写,要跟上更新操作符也就是修改器。
执行返回结果1行。
结果:
_id": objectId("5594ab1eeecd74894d19fff2") ,
"name""
:张三”,
"sex"
:男”,
“
age
”
:19,
score”
100,
"address""
:"海淀区"
"_id" : objectId("5594ab1eeecd74894d19fff3"") ,
"name" :
“李四”,
"sex :
“女”,
"age""
: 20,
“
Score
“
: 59,
“
address":
“朝阳区”
_id”: objectId(5594ab1eeecd74894d19fff4"") ,
"name":
“王五”,
“
sex” :
“女”,
"age":
19,
"score
“:
99
address"
“西城区”
只更新了第一条数据,其他19岁没有发生改变。
l 所有满足条件的数据都更新。
db.students.update( {"age" : 19} , {"$Sset" :
{ "score":100} },false,true) ;
执行结果12行,更新了11行。
结果:
"_id": objectId("5594ab1eeecd74894d19fff5""),
"name""
:赵六”,
sex":
“男,
"age"" :
20,
"score" :
100,
address"” :
东城区"
"_id": objectId("5594ab1eeecd74894d19fff6""),
"name""
:孙七",
"sex” :男,
"age"" : 19,
""score" : 100,.
"address" :"海淀区"
这是更新存在数据。
范例:更新不存在的数据
db.students.update( { "age": 30} , {"$set" : { "name":
"不存在"} },true,false) ;
//建议加上双引号 ,true表示如果数据不存在则增加。
执行:
Wri teResu
l
t( {
“
nMatched":0 ,
"nUpserted" : 1,
"nModified” :0 ,
"_id": objectId(5594d03e88427da6d2fd535a")
})
匹配数据为0,修改数据为0。
由于没有年龄是30岁的学生信息,所以此时相当于进行了数据的创建,取决于创建的原因是 true。
Update操作里面有一个最麻烦的东西:$set,整个 update 过程之中它是修改器,现在只修改数据用到了$set。
但是严格来讲,不仅内容能够修改,连集合结构也可以改,因为它是无模式的。
那么除了 update( )函数之外,还提供有一个 save()函数,这个函数的功能与更新不存在的内容相似。
范例:使用 save( )操作db.students.save(i"_id":ObjectId("5594d0f1eecd74894d1a0002"), " age":50})
db.students.save(i"_id":ObjectId("5594d0f1eecd74894d1a0002"),
表示需要修改的数据 id。
执行:
uriteResu1t({
"nMatched" : 1,
"nUpserted" : 0,
"nModified"
:1
})
匹配1条,修改1条。
由于此时对应的id数据存在了,所以就变为了更新操作。
但是如果要保存的数据不存在(不能保存有“_id"),那么就变为了增加操作。
Save( )操作并不好用,因为 update()过程编写、更新、插入或更加好用一点,而save()操作在写的时候需要找到数据id。
所以只需要知道 save()能更新、保存,update()也能更新、保存就可以了。