前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我叫Mongo,干了「查询终结篇」,值得您拥有

我叫Mongo,干了「查询终结篇」,值得您拥有

作者头像
小小许
发布于 2020-11-11 08:23:22
发布于 2020-11-11 08:23:22
1.4K00
代码可运行
举报
文章被收录于专栏:angularejs学习篇angularejs学习篇
运行总次数:0
代码可运行

这是mongo第三篇“查终结篇”,后续会连续更新5篇

  mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流。

  通过上两篇基的介绍,我相信大家对我有了初步的认识,简单查询得心用手,其实在数据工作中查询中还远远不够,今天我们在来总结查询的其它常用操作。声明,小编也是边学变总结,如果有总结的不到位的地方,希望您多多指点。​

01 简述

  通过上一篇文档,我们一起总结了mongodb查找的使用和常见的查询条件标识符。本文主要在此基础上进一步加深应用,主要从:逻辑查询符、分页查询、排序、聚合查询四方面来学习。哈哈,如果你基础很好了,当然可以完全不用看了,其实在看一下也许会有不一样的收获呢…是吧!

  在操作前,先把数据库初始化好。向数据库testdb的user集合初始化如下5条数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.user.insert([
{name:"程序员修炼之旅",age:2,from: "CTU",score:100 },
{name: "mongdb",age:13,from: "USA",score:90 },
{name: "mysql",age:23,from: "USA",score:86 },
{name: "orcle",age:45,from: "USA",score:75 },
{name: "sqlsrver", age:55,from: "USA",score:66}])

02 逻辑查询符

  逻辑操作符其实简单的理解就是将不同的单元查询符组合,通过逻辑运算符来进行逻辑判断。逻辑查询符主要包括:and、or、nor、not。下面对每一个逻辑查询符进行实操举例说明。

符号:$and(与)

说明:获取子句中的所有条件都同时匹配的所有文档,$and使用短路求值,既如果第一个表达式的结果是false,MongoDB将不会执行剩余的表达式。

语法:{$and:[{条件1},{条件2 },…,{ 条件N }]}

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查询name中包含了‘l’,并且年龄大于35的数据
db.user.find({$and:[{name:/l/i},{age:{$gt:35}}]})
// 查询出orcle、sqlsrver两条数据。
// 其实以查询与db.user.find({name:/l/i,age:{$gt:35}})等价

符号:$nor:(非)

说明:与or刚刚相反,获取子句中的一个条件都不匹配的所有文档,nor样使用短路求值,既如果第一个表达式的结果是true,MongoDB将不会执行剩余的表达式。

语法: {$nor:[{条件1},{条件2},…,{ 条件N }]}

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查询name中不包含了‘l’,并且年龄不能大于35的数据
db.user.find({$nor:[{name:/l/i},{age:{$gt:35}}]})
// 查询出程序员修炼之旅、mongodb两条数据。

符号:$not:(取反)

说明:选择出不能匹配表达式的文档,包括没有指定键的文档。not操作符不能独立使用,必须跟其他操作一起使用(除regex)。其实简单的理解,

语法: {field:{ $not:{单一操作符表达式}}}

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查找name中不包含l的数据
b.user.find({name:{$not:/l/i}})
// 查询出程序员修炼之旅、mongodb两条数据。

// 查找age不大于23(小于等于23)的数据
db.user.find({age:{$not:{$gt:23}}})
// 查询出程序员修炼之旅、mongodb、mysql三条数据。

03

查询综合应用

  关于查询条件单个操作符和逻辑查询符都掌握了,那么在实际工作中,不是简单的单个使用,需要多种情况综合使用,在使用过程中,我们用搭积木的思想来组装,把操作当着积木,一个一个拼接组合。

  来几个实例更清楚:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 实例1:

// 查询name中包含字母l或o,并且age除以3取模为1
// 命令书写思路,改条件包括3个查询积木组成:
// name中包含字母l: {name:/l/i}
// name中包含字母o: {name:/o/i}
// age除以3取模为2: {age:{$mod:[3,1]}}
// 前两查询积木通过逻辑查询符$or构成前半截查询命令
{$or:[{name:/l/i},{name:/o/i}]}

// 前后命令通过$and逻辑查询符构造完整的查下命令
db.user.find({$and:[{$or:[{name:/l/i},{name:/o/i}]},{age:{$mod:[3,1]}}]})
// 查询结果:查询mysql、sqlsrver两条数据

// 实例2:在实例1的基础上在添加一个条件,score不大于80

// 新增条件对应的条件积木为:{score:{$not:{$gt:80}}}
// 在将新增的条件积木,组装到上述并列条件即可最终的查询命令
db.user.find({$and:[{$or:[{name:/l/i},{name:/o/i}]},{age:{$mod:[3,1]}},{score:{$not:{$gt:80}}}]})
// 查询结果:查询sqlsrver一条数据

  通过上面的实例,其实我们在对复杂查询,要思路清晰,就按照堆积木的思想,一层一层的拆解组装,最终就构成了完整的查询命令。

04 排序

  Mongodb排序实现上很简单通过sort()方法,指定参数来排序,并可以根据一个或者多个节点来排序。

语法:.sort({file1: sortType,...,filen: sortType})

其中 sortType指排序方式枚举值,其中1:升序;-1:降序

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查询score大86的数据,查询结果按照from降序score升序排列

db.user.find({score:{$gte:80}}).sort({from:-1,score:1})

// 查询结果的数据顺序为:mysql、mongdb、程序员修炼之旅

//将上述查询按照from升序score降序排列

db.user.find({score:{$gte:80}}).sort({from:1,score:-1})

// 查询结果的数据顺序为:程序员修炼之旅、mongdb、mysql

  排序是不是使用起来很简单,就点到为止。

05 分页查询

我们在实际工作中,分页查询是绕不开的操作,分页查询效率也是逃不掉的话题。本次先研究如何使用分页查询,后续专门在来研究探讨查询效率问题。

  首先,我们还是规规矩矩的按照通用的方式来实现分页查询,分页查询其效果就是要实现从某一个位置开始取指定条数的数据。这就引出了两个方法,查找开始(skip),获取指定条数数据(limit)。

  • skip语法为skip(num):指跳过指定条数(num)的数据;
  • limit语法为limit(num):指限制只获取num条数据;

  分页查询语法格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.collection.fin(查询条件).sort(排序方式).skip((页码-1)*每页数据条数).limit(每页数据条数)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  实例:按照score升序排序,每页数据条数为2,查询score大于50的第2页数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.user.find({score:{$gte:50}}).skip((2-1)*2).sort({score:1}).limit(2)
// 查询结果的数据顺序为:、mysql、mongdb两条数据

  skip+ limit组合实现分页查询就是这么简单,并且也是同样的分页查询方式,但是改方式不是最优的查询方式,随着页码的增加,效率越来越低(这是因为Skip是一条一条的数过来的)。在实际工作中,我们可以根据数据关系进行高性能的分页查询实现,本次就不在探讨,后续专门探讨改问题。

06 求和

  Mongodb提供了count(applySkipLimit)进行求和,是一个比较常见的函数,使用简单,但是有一个点需要注意的是其参数的使用。

  applySkipLimit:是一个bool值,代表是否应用于skip好limit函数,true:代表当应用于skip和limit是,返回最终限制后的数据条数;false:代表返回数据条数不受skip和limit函数的影响;默认值为false。还是用例子说事。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 查询 from不等于CTU的数据同条数
db.user.find({from:{$not:{$eq:"CTU"}}}).count()
// 查询结果为 4
db.user.find({from:{$not:{$eq:"CTU"}}}).count(true)
// 查询结果为 4

// 当查询使用skip跳过第一条数时,获取数据总条数
db.user.find({from:{$not:{$eq:"CTU"}}}).skip(1).count()
// 查询结果为 4
db.user.find({from:{$not:{$eq:"CTU"}}}).skip(1).count(true)
// 查询结果为 3  正常情况下,这才是我们想要的结果

// 当查询使用limit限制查询数据时,获取数据总条数
db.user.find({from:{$not:{$eq:"CTU"}}}).limit(2).count()
// 查询结果为 4
db.user.find({from:{$not:{$eq:"CTU"}}}).limit(2).count(true)
// 查询结果为 2 正常情况下,这才是我们想要的结果

  通过上面的实例我们得知applySkipLimit只有遇到skip或者limit函数才生效,平时在使用的时候这也是一个需要注意的点。

07 小结

  通过本问和上两篇文章的总结,现在对mongodb的基础已经总结告一段落。本文重点对通过实例对查找中的逻辑符(and、or、nor、not)和查询常用函数(sort、skip、limit、count)四个函数使用进行重点介绍。通过实例我相信能够解决实际工作的60%的问题。接下来的主要对mongodb的高级操作进行学习总结,期待您的持续关注与支持,谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MySQL 开源许可研究
在 MySQL 中引用的第三方源代码,全部都基于不具备许可证传染性的宽松开源许可证发布,或者基于双许可证发布,Oracle 在其开源版 MySQL 中对此类双许可证的第三方代码 选择使用 GPLv2 许可证,在闭源的商业版 MySQL 中对此类双许可证的第三方代码选择使 用更为宽松的许可证。
爱可生开源社区
2022/05/30
9920
Linux之父:我们不会用Rust取代C语言开发内核
Linux 诞生于 1991 年,距今已经 30 年了。虽然它一开始只是 Linus 的一个个人项目,而非出于要开发一个新操作系统的伟大梦想,但如今的 Linux 早已无处不在。
范蠡
2021/06/17
1.1K0
QT6实战-QML与C++联合编程
Qt是1991年由HaavardNord和EirikChambe-Eng开发的跨平台C++图形用户界面应用程序开发框架。发展至今,它既可以开发GUI程序,也可以开发非GUI程序,比如控制台工具和服务器。Qt是一个跨平台的C++应用程序框架,支持Windows、Linux、MacOSX、Android、嵌入式系统等。也就是说,Qt可以同时支持桌面应用程序开发、嵌入式开发和移动开发,覆盖了现有的所有主流平台。开发者只需要编写一次代码,而后在发布到不同平台之前重新编译即可。
小企鹅204415010
2024/05/14
7110
一起来逆向分析某黑产APP
首先这是一个挂羊皮卖狗肉的黑产APP,它通过文字和图片展示几个主流游戏和各种游戏皮肤可以实现作弊功能的APP,还有每次抽奖必中一箱茅台或一百元的话费福利。这一系列的钓鱼手法下来总有人愿意为这些诱惑买单。
小道安全
2023/02/28
8800
一起来逆向分析某黑产APP
如何正确地在Android手机上安装国产软件?
国产软件往往会申请与之功能不符的权限,读取着用户手机信息,开机后就驻足系统,这些对于注重隐私的用户来说都是问题。如何“干净”地安装国产流氓软件呢?笔者整理了一些思路供大家探讨。 国产app的全家桶问题一直被大家诟病,一个应用启动后就会“唤醒”其“家族”内的其他应用,有时还会通过其他方式确保应用始终在后台运行;与此同时,很多应用还会申请与之功能完全不符的权限,这些严重破坏了Android系统的体验。 要获得一个纯净的体验,我们需要解决的是两种问题,首先是软件自启动、驻足后台、频繁唤醒;其次是应用对手机信息
FB客服
2018/02/23
3.9K0
如何正确地在Android手机上安装国产软件?
深入理解开源许可证(Apache,MIT,GPL,BSD,CC)
如果说有什么东西正在为开源世界保驾护航,那就一定不能不提到开源许可证(Open Source License),正是因为这些各不相同的开源许可证的共同支持下,才有了现在这么繁荣的开源软件社区。
HikariLan贺兰星辰
2022/10/27
3.8K0
太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]
我想起来我账号密码了,看到有一篇写了一半的草稿,正巧兄弟最近装了个太极。本来想着私密发布的然后发现好像没法发给别人。索性也就公开了
全栈程序员站长
2022/09/05
2.6K0
甲骨文火上浇油、SUSE投入1000万美元,多方“围剿”红帽:“红帽负担不起?那我们来!”
甲骨文对红帽开启了嘲讽模式,而 SUSE 则直接投入 1000 万美元创建 RHEL 分支。
深度学习与Python
2023/08/09
2960
甲骨文火上浇油、SUSE投入1000万美元,多方“围剿”红帽:“红帽负担不起?那我们来!”
🤖️ 如何逐步关闭 MIUI 无处不在的广告
最近需要给长辈置换一下手机,在有限的预算内,经过多次比较发现还是小米的硬件配置更好一些,最后也是下单了小米。
卤代烃
2022/11/08
3.6K0
🤖️ 如何逐步关闭 MIUI 无处不在的广告
RootTools, 是时候收手了
作为一个开发、维护了 8 年的项目,RootTools 今天也许已经走到了尽头,作为它的主力开发者,我很高兴能在今天为它画上一个句号。
开源社
2019/05/29
9490
分享一些<Linus Torvalds 访谈>中不错的问答,应该会有收获~
最近看了一篇文章<Linux 的 30 年Linus Torvalds 访谈>,linus作为嵌入式领域的技术大牛,在访谈中发表了自己的一些观点,有一些挺有参考价值的,这里挑了一些出来供大家学习参考。
嵌入式与Linux那些事
2022/05/24
5070
瓜分BAT的流量红利:头条向左,小米向右
回首互联网前面的二十年会发现,广告是互联网商业化的第一基石,互联网广告走过了黄金二十年,从门户到搜索到联盟到社交再到电商,不同广告形式开启接力跑,最近几年互联网盈利模式正在巨变。
罗超频道
2019/07/17
7070
瓜分BAT的流量红利:头条向左,小米向右
Android Hook与简单的xposed模块开发实例
Hook是一种在特定事件或操作发生时插入自定义代码的编程技术。在前端开发中,例如Vue和Angular的生命周期钩子,体现了Hook的机制,允许开发者在组件的不同阶段执行代码,提升代码的模块化和可重用性。
阿菇kinoko
2025/01/24
2781
Android Hook与简单的xposed模块开发实例
为啥安卓手机越用越卡?
根据第三方的调研数据显示,有77%的Android手机用户承认自己曾遭遇过手机变慢的影响,百度搜索“Android+卡慢”,也有超过460万条结果。在业内,Android手机一直有着“越用越慢”的口碑,这个现象甚至超出了硬件范畴——很多中高端Android手机在硬件参数上都优于同一代iPhone,但是它们仍然会在使用半年到一年的时间后进入“欠流畅”的状态——这无疑是一件令人困扰的事情。   然而,若是要回答这个问题,我们需要追溯到上个世纪,去寻找智能手机的起源。   西方历史及奇幻文学作品十分热衷于表达“血
程序员互动联盟
2018/03/15
1.6K0
【Dev Club 分享】微信热补丁 Tinker 的实践演进之路
Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。 本期,我们邀请了腾讯WXG Android开发工程师——张绍文,为大家分享《微信热补丁 Tinker 的实践演进之路》。 分享内容简介: Tinker 是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。这里大致介绍 Tinker 的实现原理,当时遇到的各种坑以及对它各个方面性能的优化工作。 内
腾讯Bugly
2018/03/23
1.2K0
EcmaScript的持续升级将加速JavaScript框架的淘汰
每当 JavaScript 发布重大更新,我们都会重复相同的经历。最开始的时候,开发人员会因为新功能的发布而感到高兴。他们会直接使用 JavaScript 编写代码,框架的流行度会下降。接着,在较长一段时间内都没有新的发布时,框架就会提供各种新功能,从而吸引开发人员。然后,再次重复这个过程。
Jean
2021/11/28
5890
EcmaScript的持续升级将加速JavaScript框架的淘汰
分析了 6000 款 App,竟有这么多佳软神器没用过
摘要:在《6000 多款 App,看我如何搞定她们并将其洗白白~》中我们详细地分享了有关Scrapy框架抓取App数据的流程,并对抓回来的数据作了进一步的清洗。在本次分享中,接着对抓取回来的数据进行探索性分析,让你知道目前App市场的状况。
1480
2019/08/05
7050
分析了 6000 款 App,竟有这么多佳软神器没用过
Pentestbox神器说明(一)
前言 实在太多,分两次公布 1、目录结构 2、软件安装 终端下输入:toolsmanager 打开工具管理器,在这里可以 安装/升级/卸载 软件 首先,它会从GitHub的信息库自动更新,然后会显示
用户1467662
2018/03/30
3.7K0
Pentestbox神器说明(一)
Pytorch 1.0正式版发布!TensorFlow王位不保?曾经Pytorch许诺的都实现了吗?
12月8日,在加拿大蒙特利尔召开的NeurIPS 2018会议上,Facebook 宣布正式推出 PyTorch 1.0 稳定版,在 Facebook code 博客上,也一并同步了这一消息。
abs_zero
2018/12/26
9570
开源软件的商业模式
Business models for open-source software / 开源软件的商业模式
开源社
2022/04/11
2.4K0
推荐阅读
相关推荐
MySQL 开源许可研究
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档