目录
数据更新
数据如何更新?
MySQL更新案例
Mongdb更新案例
方法一:
方法二(推荐):
总结
每文一语
数据更新
数据如何更新?
我们都知道在MySQL里面经常用到数据的查询,但是在MySQL里面还有一个特别重要的就是数据更新,为了保证数据的实时准确,我们需要设计模式达到自动模式,这样就不会是简单的手动的操作了。同样的道理,在mongdb里面,数据更新也是一个比较重要的部分,它的更新语法和MySQL有一些小的差异,下面我们来看看具体的操作吧。
MySQL更新案例
在MySQL里面的更新语法我们来回忆一下:
UPDATE 表名 SET 原值1=新值1, 原值2=新值2 定位条件
UPDATE tb_student SET GENDER='女' WHERE ID='2019888888';
Mongdb更新案例
思想永远是一样的,在MySQL里面的更新语法虽然和mongdb不太一样,但是:思路都是一样的,首先我们来看看它的语法:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
注意:我们知道在MySQL里面中文变量是不允许的,但是在mongdb里面是支持的,所以我们作为初学者,可以使用中文变量来方便我们更好的理解
首先我们插入一条记录作为我们的训练集:
var wxw = {
"name": "王小王",
"gender": 1,
"height": 162,
"phone": "15902333748",
"role": "student",
"sno": 2019999999,
"major": "应用统计",
"grade": 2019,
"class": 4,
"courses": [
{
"course": "网络操作系统",
"credit": 2,
"score": 99
},
{
"course": "大数据分析与内存计算",
"credit": 4,
"score": 88
}
]
};
db.students.insertOne(wxw);
db.students.find({sno:2019999999});
这种方式是不可行的,因为更新文档会覆盖原来的信息
// 修改王小王同学的身高为199
var 查询条件 = {role:"student",name:"王小王"} ;
var 更新文档 = {height:199} ; //如果不包含操作符,那么就是完全覆盖的替换,慎用!
// var 更新文档 = wxw;
var 更新选项 = {} ;
db.students.update(查询条件,更新文档,更新选项);
db.students.find(查询条件);
方法一:
修改方法一:直接修改本地内存数据,然后上传到数据中心可以达到这个效果
wxw.height=199
wxw
result = db.students.find({sno:2019999998});
我们发现数据源根本没有变化,只是内存数据变化了,那么我们就会有一个想法:把内存数据覆盖到元数据地址,那么就可以达到效果了
// 修改方法一:先查询出整个文档,在本地修改好了之后,再上传回数据库
// 1. 查出原始文档
use cqust;
var 查询条件1 = {role:"student",name:"王小王"} ;
var wxw = db.students.find(查询条件1);
// 2. 本地修改查询出的文档
wxw.height=123;
var 更新文档 = wxw;
// 3. 将本地修改好的文档作为更新文档,上传数据库进行更新
db.students.update(查询条件1,更新文档,更新选项);
db.students.find(查询条件1);
方法二(推荐):
// 修改方法二,使用$set操作符来构建更新操作文档
var 查询条件={name:"王小王"};
var 更新操作文档 = {$set:{weight:66}}; // 新增或者修改文档字段
var 更新选项 = {} ;
db.students.update(查询条件,更新操作文档,更新选项);
db.students.find(查询条件);
直接修改了weight,因为之前不存在这个字段(如果不存在就新增,存在就会覆盖)
如果我们要把一个字段名删除,然后再去构造一个新的字段名来达到更新的效果一个怎么去做?看案例操作:
// 更新文档:删除字段和插入字段
db.students.update({"name": "王小王","gender": 1},{$unset:{"height":1},$set:{"body":{"height": 162, "weight":66}}})
var query = {"name": "王小王","gender": 1}
var updateOp = {
$unset:{"height":1},
$set:{"body":{"height": 162, "weight":66}}
};
db.students.update(query, updateOp)
使用$unset:{"字段名":1}删除
使用$set:{"新字段名":1111} 也可以嵌套多层结构,例如上述案例
修改一个不存在文档
var query = {"name": "刘王宇","gender": 1}
var upOperation = {
$unset:{"height":1},
$set:{"body":{"height": 162, "weight":66}}
};
var upOption = {upsert:1}//如果不存在这个文档,就会进行相关的增加操作
var result = db.students.update(query, upOperation,upOption)
db.students.find({"name": "刘王宇"})
总结
对于更新文档操作:我们可以使用修改本地内存数据再去上传最后达到修改效果,也可以使用update方法里面:查询,更新,更新选项,进行操作
个人推荐第二种方法,因为具有可执行性,如果你钟爱第一种也是可以的
- {$set:{字段:值}} 新增或者修改字段
- {$unset:{字段:""} 删除字段
- var upOption = {upsert:1} 如果不存在这个文档,就会进行相关的增加操作,如果没有这个选项那么如果不存在就不会进行增加操作!
每文一语
做一朵只为自己盛开的花,在无声中绽放,静静地欣赏!