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

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

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

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

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

01 简述

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

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

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 }]}

实例:

// 查询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 }]}

实例:

// 查询name中不包含了'l',并且年龄不能大于35的数据
db.user.find({$nor:[{name:/l/i},{age:{$gt:35}}]})
// 查询出程序员修炼之旅、mongodb两条数据。

符号:$not:(取反)

说明:选择出不能匹配表达式的文档,包括没有指定键的文档。$not操作符不能独立使用,必须跟其他操作一起使用(除$regex)。其实简单的理解,$not是对前面将的单一操作符的修饰。如果对单一操作符了解的,可以查看上一篇文章:我叫Mongo,收了「查询基础篇」,值得你拥有

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

实例:

// 查找name中不包含l的数据
b.user.find({name:{$not:/l/i}})
// 查询出程序员修炼之旅、mongodb两条数据。

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

03

查询综合应用

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

来几个实例更清楚:

// 实例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:降序

实例:

// 查询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条数据;

分页查询语法格式:

db.collection.fin(查询条件).sort(排序方式).skip((页码-1)*每页数据条数).limit(每页数据条数)
实例:按照score升序排序,每页数据条数为2,查询score大于50的第2页数据
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。还是用例子说事。

// 查询 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的高级操作进行学习总结,期待您的持续关注与支持,谢谢!

END
原创不易,感谢扫描支持,获取更多精彩,谢谢:

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

Original: https://www.cnblogs.com/xiaoXuZhi/p/13957429.html
Author: 程序员修炼之旅
Title: 我叫Mongo,干了「查询终结篇」,值得您拥有

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/613013/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • WEB安全信息收集

    每次做测试都要去网上找信息太费劲这里放了常用的所有工具和网站,后期有更新在改。 子域名&敏感信息 通过大量的信息收集,对目标进行全方位了解,从薄弱点入手。 利用Google…

    Linux 2023年6月7日
    078
  • 关于网络安全防护架构中的DMZ区

    公司有一个网站群的业务,应用规模比较大,目前计划是从传统的虚拟机部署方式迁移到内部的私有云。 这种迁移的动作是一个很好的学习机会。在交流的时候的时候,领导有提到现有的架构基本上是参…

    Linux 2023年6月14日
    095
  • 详解Docker 跨服务器通讯 Ambassador原理

    先看拓扑图:Ambassador 主要用来解决跨服务器通讯,因为同服务器通讯相对简单,直接用–link参数,或者用bridge网络即可。 服务器B的Docker2:ce…

    Linux 2023年6月6日
    095
  • 对脱壳脚本的一些改进–识别出目标DEX

    一、前言 通常对于加壳的程序,第一步的操作通常是脱壳,而现在脱壳一般都选择利用 frida 来进行 hook 进行脱壳,不谈其他脱壳方式,利用 frida 脱壳原理大致分为两种: …

    Linux 2023年6月8日
    095
  • Redis集群搭建准备,了解一致性哈希算法和哈希槽

    一致性哈希是在哈希取余算法基础之上优化的,分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不对了。用于解决分布式缓存系统中的数据选择节点存储问题和数据选择节…

    Linux 2023年5月28日
    083
  • Docker 安装 ElasticSearch 及失败解决方法[Ubuntu 20.04]

    1. 下载 ElasticSearch 最开始使用 docker search命令搜索后,就直接使用 docker pull命令拉取镜像,但没想到拉取失败,后来到官网看了看,原来没…

    Linux 2023年6月14日
    0131
  • linux全新机器环境搭建流程梳理

    软件解压后安装基础指令(复制用):./configure && make && make install ./configure –pr…

    Linux 2023年6月6日
    081
  • ubuntu vmlinux 获取

    1.从ubuntu keyserver获取key ubuntu 16.04及以后的系统:$sudo apt-key adv –keyserver keyserver.u…

    Linux 2023年6月6日
    092
  • 15、16、17思维导图

    posted @2022-04-24 10:20 20191223张俊怡 阅读(31 ) 评论() 编辑 Original: https://www.cnblogs.com/zzj…

    Linux 2023年6月8日
    0130
  • 自制弹窗拦截器

    一个十分简单的bat脚本 如果需要拦截更多弹窗,只需要将第6~8行复制一下并粘贴到:3后面,将所有的SGtool改成要拦截的进程名即可,每添加一个进程,就要将标号加一,我相信你们能…

    Linux 2023年6月6日
    086
  • C语言之初认识

    1.低级语言可以简明说:非常接近底层语言 2.可移值性:可以嵌入各大系统中 3.简单性:语法简单,语法规则没有太大限制,c语言的代码要求比较随意,一行可以写入多行语句,每条语句写完…

    Linux 2023年6月8日
    082
  • Xbox无法进入开发者模式

    从2020.09.01起,Xbox的dev mode app估计是证书过期或者其他系统配置问题,导致大量开发者无法进入开发者模式,具体如下图所示。 针对上述问题,可以通过微软预先设…

    Linux 2023年6月13日
    0236
  • IDEA链接MySQL报错:服务器返回无效时区

    Server returns invalid timezone. Go to ‘Advanced’ tab and set ‘serverTim…

    Linux 2023年6月14日
    0101
  • 多态

    一.相关定义 1-1 多态 多态是同一个行为具有多个不同表现形式或形态的能力。同一个形参类型为基类的接口,使用不同的子类的实例可以执行不同操作。 1-2 绑定 绑定:将一个方法调用…

    Linux 2023年6月8日
    073
  • js中对象深度拷贝的方法(浅拷贝)

    JS中,一般的赋值传递的都是对象/数组的引用,并没有真正的深拷贝一个对象(浅拷贝),某些情况下需要用到深度拷贝,可以使用如下写法 let data = {username:&quo…

    Linux 2023年6月14日
    097
  • 二值图像求取连通域算法

    一幅图像二值化处理后往往包含多个区域,需要通过标记把它们分别提取出来。标记分割后图像中各区域的简单而有效的方法是检查各像素与其相邻像素的连通性。 在二值图像中,背景区像素的值为0 …

    Linux 2023年6月14日
    0112
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球