初识Mongdb之数据查询篇(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 初识Mongdb之数据查询篇(二)

目录

进阶查询

模糊查询(正则表达式)

进阶修改

指定字段修改

指定字段查询

数组操作

指定字段修改(数组类型)

删除数组的第一个元素

追加一个元素到末尾

插入一个元素到数组的指定位置

删除数组里面的特定的元素

批量操作文档

更新多个文档

删除多个文档

操作不存在的文档


进阶查询

模糊查询(正则表达式)

image.png

对于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);

image.png

遇到数组里面的查询,我们首先应该想到这个操作符:$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索引就是中间位置

image.png

删除数组里面的特定的元素

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")})

image.png

那么我们在假设一下这个案例,比如我们有时候不小心写错了条件,原本不存在的信息,我们会不会在操作符上面做一些限定,来展示一些插入信息

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
}
*/
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 数据库
在TiDB中查询数据
【2月更文挑战第29天】在TiDB中查询数据涉及基本语法如SELECT,条件查询(WHERE子句),排序(ORDER BY),分组(GROUP BY)和聚合函数(COUNT, SUM等)。LIMIT与OFFSET用于分页,子查询和连接查询处理复杂场景。注意列名和表名准确性,优化查询以提升性能,谨慎使用更新或删除操作。
|
7月前
|
存储 关系型数据库 MySQL
|
7月前
|
SQL 定位技术 数据库
数据库基础(四):数据查询
数据库基础(四):数据查询
103 1
|
NoSQL MongoDB
07 MongoDB - 数据查询
07 MongoDB - 数据查询
52 0
|
NoSQL MongoDB
10 MongoDB - 数据查询(排序)
10 MongoDB - 数据查询(排序)
68 0
|
SQL 关系型数据库 MySQL
11_MySQL数据处理(增删改)
11_MySQL数据处理(增删改)
67 0
|
JavaScript 前端开发 NoSQL
初识Mongdb之数据查询篇(三)
初识Mongdb之数据查询篇(三)
100 0
初识Mongdb之数据查询篇(三)
|
SQL 人工智能 安全
MySQL数据库之数据查询
本文主要讲述了数据库中的SELECT语句、集函数查询、单表查询、多表查询、嵌套查询、子查询、带EXISTS关键字的子查询,并通过案例演示SQL语句的实际应用,可以帮助很好的帮助大家数据库的入门学习。
MySQL数据库之数据查询
|
SQL 存储 前端开发
|
关系型数据库 MySQL 数据处理
11章MySQL:数据处理之增删改
11章MySQL:数据处理之增删改