目录
进阶查询
模糊查询(正则表达式)
对于MySQL里面我们也有模糊查询,但是在mongdb里面的模糊查询应该比MySQL更加实用,因为mongdb储存的是文档类型居多,而MySQL是数据类型居多。
MySQL语法:
找出u_name中既有“三”又有“猫”的记录
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'
mongdb语法:
找出雷什么轩的信息
db.students.find({name:/^雷.*轩$/})
进阶修改
指定字段修改
在一个表结构里面我们需要对某一个字段进行修改,来保证数据的实时准确性,就需要我们做一些修改,但是我们之前讲过,修改可以进行覆盖性的修改,但是我们不想要这样。
案例1:比如我们遇到了这样一个场景:体育老师在进行全班的人员的信息采集的时候,采集完毕之后发现测量身高的仪器好像坏了,导致全班的身高都变少了1CM,作为老师的体育课代表你应该怎么做?
//构造查询文档 use cqust; var query = { major: '大数据', class: 1, grade: 2019, height: { $lt: 170 } };
之后我们可以利用循环,mongdb里面也可以写循环,但是语法规则要满足JavaScript语法,不然会报错
排序之后查询出来
db.students.find(query).sort({height:-1});
我们发现查询出来的结构具有数组结构的类型,那么我们在想可不可以利用数组的语法来显示
1. var restult1 = db.students.find(query); 2. 3. restult1[0]["name"]
利用JavaScript的语法写一段查询
1. var idlist = new Array(); 2. 3. for (var i = 0; i < restult1.length(); i++) { 4. idlist[i] = restult1[i]["name"]; 5. } 6. idlist;
现在可以操作我们的问题了
//更新操作文档 var querys={name:{$in:idlist}} var updates={$inc:{height:-1}}; var options={multi:1}; db.students.update(querys, updates, options); db.students.find(query).sort({height:-1});
上面这个问题是站在某一个第一字段修改的,那么有时候我们修改的是嵌入式文档里面的字段,这个时候我们应该如何去批量操作:比如我需要修改课程成绩里面的某一科的成绩,给它加几分,那么我们这个时候应该如何去定位这个标签字段,然后实现批量的修改。
学而不思则罔,思而不学则殆,留给你们自己去发挥了,有想法的可以在评论区留言,欢迎你的来访!
指定字段查询
在一个文档里面我们需要获取到某一科的成绩,而且只要求返回这个成绩的信息
比如我们需要查询,有一科叫做:分布式***的学科不及格的信息,我们应该怎么去做
//查询分布式的课程的不及格信息,注意只需要返回该课程的分数 var 查询条件 = { 'courses': { $elemMatch: { 'course': /分布式/, 'score': { $lt: 60 } } } } var 返回条件2 = { _id: 0, 'name': 1, 'sno': 1, 'courses': {$elemMatch:{'course':/分布式/}} //利用数组elemMatch方法 }; db.students.find(查询条件, 返回条件2);
遇到数组里面的查询,我们首先应该想到这个操作符:$elemMatch:{一些并列的约束条件},比如我们需要查询某一科的成绩,而且这个成绩必须是在一个特定的约束的范围里面,那么我们就需要这个方法来满足并列的关系
数组操作
指定字段修改(数组类型)
比如我们需要修改学号:2019000000的学生的的abody里面的身高为174,
// 先查询出数组元素的值 var 查询条件 = {'sno':2019000000} var 返回条件 = {_id:0,'abody':1} var res = db.students.findOne(查询条件,返回条件) res.abody[0]=174 var 更新操作 = {$set:{'abody':res.abody}} db.students.update(查询条件,更新操作) //updateOne updateMany
我们首先利用findone来返回一个数组,我们如果利用find()直接操作,会报错,很明显就是字段数组里面的限制。
删除数组的第一个元素
//删除数组的第一个元素 var 查询条件 = {'sno':2019000001} var 更新操作={$pop:{'abody':-1}} //1代表删除最后一个 db.students.update(查询条件,更新操作)
这里就把abody里面的第一个元素删除了,我们如果把pop里面的属性改为了1,那么就是删除的最后一个,实际的场景我们自己确定
追加一个元素到末尾
//追加一个元素到末尾 var 查询条件 = {'sno':2019000001} var 更新操作={$push:{'abody':65}} db.students.update(查询条件,更新操作)
追加使用push命令
插入一个元素到数组的指定位置
//插入一个元素到数组的指定位置,把14插入abody的第一个元素里面 var 查询条件 = {'sno':2019000001} var 更新操作={$push:{'abody':{$each:[14],$position:1}}} db.students.update(查询条件,更新操作)
这里的1索引就是中间位置
删除数组里面的特定的元素
var 查询条件 = {'sno':2019000001} var 更新操作={$pull:{'abody':164}} db.students.update(查询条件,更新操作)
删除了abody里面的特定的元素,也就是164
看了这么多的数组类型的操作,那么对于之前的非数组的字段,你还记得吗?之前讲过哟,下面我们就来回顾一下吧:
//删除非数组里面的元素 var 查询条件 = {'sno':2019000001} var 更新操作={$unset:{'body.weight':1}} db.students.update(查询条件,更新操作) //增加非数组里面的字段元素 var 查询条件 = {'sno':2019000001} var 更新操作={$unset:{'body.weight':1}} db.students.update(查询条件,更新操作)
批量操作文档
更新多个文档
var 查询条件={'name':/^王/,gender:1} db.students.find(查询条件) var 更新操作={$inc:{'body.height':1}} var 更新选项={multi:1} //updatemany()更新多个文档,updateone()更新一个文档 db.students.update(查询条件, 更新操作, 更新选项) db.students.find(查询条件)
更新了多个文档,文档信息就是包含我们需要的条件约束
删除多个文档
//默认删除全部的满足条件信息,deleteMany var 查询条件={'name':/^王/,gender:1} db.students.remove(查询条件) //只删除第一个匹配结果 var 查询条件={'name':/^王/,gender:0} var 删除选项={'justOne':1} db.students.remove(查询条件,删除选项) //同理 db.students.deleteOne(查询条件)
操作不存在的文档
假设我们有一个本地文档已经不存在了,但是吧,我们也不知道这个存不存,这个时候我们本地已经存在这样一个案例,我们需要通过查询和更新,来上传这个文档记录
// 更新一个不存在的文档 var 王小王 = { "name": "王小王", "gender": 1, "body": { "height": 177, "weight": 60 }, "abody": [ 177, 55 ], "phone": "15730596577", "role": "student", "sno": 2019000891, "major": "大数据", "grade": 2019, "class": 3, "courses": [ ] } var 查询条件 = {"name": "王小王"} // 这个条件查询不到结果,数据库中没有这样的记录 var 替换文档 = 王小王 db.students.update(查询条件,替换文档)
var 更新选项 = {upsert:1} db.students.update(查询条件,替换文档,更新选项) /* WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("605738c72410a0e84779ac7d"), "writeConcernError" : [ ] }) */ db.students.find({_id:ObjectId("605738c72410a0e84779ac7d")})
那么我们在假设一下这个案例,比如我们有时候不小心写错了条件,原本不存在的信息,我们会不会在操作符上面做一些限定,来展示一些插入信息
var 查询条件 = {"name": "王小小"} // 条件写错,查不到 var 更新操作 = {$set:{sno:2019999999}} // 带操作符的更新文档 var 更新选项 = {upsert:1} db.students.update(查询条件,更新操作,更新选项) /* WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("6057395a2410a0e84779ac91"), "writeConcernError" : [ ] }) */ db.students.find({"_id" : ObjectId("6057395a2410a0e84779ac91")}) /* 新文档相当于在空白文档上做了更新 { "_id": ObjectId("6057395a2410a0e84779ac91"), "name": "王小小", "sno": 2019999999 } */