目录

进阶查询

模糊查询(正则表达式)

进阶修改

指定字段修改

指定字段查询

数组操作

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

删除数组的第一个元素

追加一个元素到末尾

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

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

批量操作文档

更新多个文档

删除多个文档

操作不存在的文档

每文一语


进阶查询

模糊查询(正则表达式)

$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。

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

我们发现查询出来的结构具有数组结构的类型,那么我们在想可不可以利用数组的语法来显示

var restult1 = db.students.find(query);restult1[0]["name"]

利用JavaScript的语法写一段查询

var idlist = new Array();for (var i = 0; i < restult1.length(); i++) {idlist[i] = restult1[i]["name"];
}
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
}*/

每文一语

  • 身处困境的时候,坦然一笑,是一种豁达。
  • 被人误解的时候,微微一笑,是一种素养。
  • 受委屈的时候,淡然一笑,是一种大度。
  • 无奈的时候,达观一笑,是一种境界。
  • 被批评的时候,平静一笑,是一种自信。
  • 受挫折的时候,欣然一笑,是一种乐观。
  • 随时随地将微笑带在脸上,也是一种美丽。

初识Mongdb之数据查询篇(二)相关推荐

  1. ACCP学习旅程之----- SQL Server(第五章 数据查询(二))

    特别注意:主外健关系中,名字可以不同,类型和长度必须相同. 1¥ 模糊查询     模糊查询提取的数据不一定是确切的,查询者对查询条件也是模糊的.大概的.不特别明确的. 1$ 使用Like进行模糊查询 ...

  2. ElasticSearch对地理数据查询(二)

    在ElasticSearch中,地理位置通过geo_point这个数据类型来支持.地理位置的数据需要提供经纬度信息,当经纬度不合法时,ES会拒绝新增文档.这种类型的数据支持距离计算,范围查询等.在底层 ...

  3. 测试工程师mysql数据库基础操作之DQL 数据查询篇

    文章目录 基本使用 where 语句 普通比较运算符 between ... and ...,匹配指定范围 like,模糊匹配 is null,匹配空值 特殊比较运算符 逻辑运算符 单行函数 数字函数 ...

  4. 数学建模最新教育数据分享及数据查询方法(数据来源:世界银行、世界数据图册、联合国教科文组织、国家统计局)

    授人以鱼不如授人以渔,分享最新数据获取方法,持续更新,点关注不迷路! 世界银行教育数据下载链接:https://download.csdn.net/download/qq_37372155/15081 ...

  5. CYQ.Data 轻量数据层之路 使用篇-MAction 数据查询 视频 D (二十一)

    2019独角兽企业重金招聘Python工程师标准>>> 说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)   的附加视频教 ...

  6. 学习SQL数据查询,这一篇就够了!

    [任务概述] 建立数据库的目的主要是为了对数据库进行操作,以便能够从中提取有用的信息,而数据查询则是数据库操作的核心. 扩展阅读:<学习SQL数据更新,这一篇就够了!> 文章目录 一.SQ ...

  7. MongoDB 数据操作(二)数据查询(10)正则运算

    来源:我的博客站 OceanicKang |<MongoDB 数据操作(二)数据查询(10)正则运算> 上一篇:<MongoDB 数据操作(二)数据查询(9)条件过滤> 如果要 ...

  8. 2021年大数据Spark(二十七):SparkSQL案例一花式查询和案例二WordCount

    目录 案例一:花式查询 案例二:WordCount 基于DSL编程 基于SQL编程 具体演示代码如下: 案例一:花式查询 package cn.itcast.sqlimport org.apache. ...

  9. Spring Boot 揭秘与实战(二) 数据缓存篇 - EhCache

    文章目录 1. EhCache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 EhCache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存篇 - 快速入门 ...

最新文章

  1. FFmpeg简介及在vc2010下编译步骤
  2. 2万长文,一文搞懂Kafka
  3. HDU-1789-Doing Homework again
  4. VHD安装的Win7 X64系统迁移到VMware虚拟机(P2V)...
  5. samtools常用命令详解
  6. 华为鸿蒙系统好在哪,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  7. latax 使用说明
  8. Codechef Black Nodes in Subgraphs(树型背包)
  9. 仿微信图片上传,带加号,且超过最大数隐藏
  10. 2015年春节往事小记
  11. 如何在 Python 中异步操作数据库?aiomysql、asyncpg、aioredis 使用介绍
  12. 清华大学计算机系前景好么,华为正式宣布选择西工大,而不是清华计算机系,网友:为什么?...
  13. 模块一:深度学习入门算法
  14. UE4 更改工程文件名字的方法
  15. python处理excel多重筛选
  16. pg数据库numeric对应oracle,Oracle类型number与PG类型numeric对比和转换策略
  17. WHERE EXISTS
  18. MultipartFile.transferTo(dest) 报找不到文件错误以及解决方法
  19. Spring Boot集成支付宝(最新版SDK)—— 手机支付
  20. 【海康威视】WPF客户端二次开发:【3】制作WPF/Winform安装包

热门文章

  1. module 与 component 的区别
  2. 分类:决策树——剪枝
  3. git本地仓库关联远程仓库的两种方式
  4. oracle中sql查询
  5. 服务器系统都有哪些?
  6. 《数据结构(C语言版)》严巍敏课件~第二章:线性表
  7. codeforces 1326 E.Bombs
  8. 美甲实体行业没有客户?想做线上引流?这些渠道千万别错过!
  9. K-近邻算法(分类算法)
  10. python的sort函数