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

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

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

01     简述

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

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

  1. db.user.insert([
  2. {name:"程序员修炼之旅",age:2,from: "CTU",score:100 },
  3. {name: "mongdb",age:13,from: "USA",score:90 },
  4. {name: "mysql",age:23,from: "USA",score:86 },
  5. {name: "orcle",age:45,from: "USA",score:75 },
  6. {name: "sqlsrver", age:55,from: "USA",score:66}])

02     逻辑查询符

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

符号:$and(与)

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

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

实例:

  1. // 查询name中包含了‘l’,并且年龄大于35的数据
  2. db.user.find({$and:[{name:/l/i},{age:{$gt:35}}]})
  3. // 查询出orcle、sqlsrver两条数据。
  4. // 其实以查询与db.user.find({name:/l/i,age:{$gt:35}})等价

符号:$nor:(非)

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

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

实例:

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

符号:$not:(取反)

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

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

实例:

  1. // 查找name中不包含l的数据
  2. b.user.find({name:{$not:/l/i}})
  3. // 查询出程序员修炼之旅、mongodb两条数据。
  4.  
  5. // 查找age不大于23(小于等于23)的数据
  6. db.user.find({age:{$not:{$gt:23}}})
  7. // 查询出程序员修炼之旅、mongodb、mysql三条数据。

03

     查询综合应用

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

  来几个实例更清楚:

  1. // 实例1:
  2.  
  3. // 查询name中包含字母l或o,并且age除以3取模为1
  4. // 命令书写思路,改条件包括3个查询积木组成:
  5. // name中包含字母l: {name:/l/i}
  6. // name中包含字母o: {name:/o/i}
  7. // age除以3取模为2: {age:{$mod:[3,1]}}
  8. // 前两查询积木通过逻辑查询符$or构成前半截查询命令
  9. {$or:[{name:/l/i},{name:/o/i}]}
  10.  
  11. // 前后命令通过$and逻辑查询符构造完整的查下命令
  12. db.user.find({$and:[{$or:[{name:/l/i},{name:/o/i}]},{age:{$mod:[3,1]}}]})
  13. // 查询结果:查询mysql、sqlsrver两条数据
  14.  
  15. // 实例2:在实例1的基础上在添加一个条件,score不大于80
  16.  
  17. // 新增条件对应的条件积木为:{score:{$not:{$gt:80}}}
  18. // 在将新增的条件积木,组装到上述并列条件即可最终的查询命令
  19. db.user.find({$and:[{$or:[{name:/l/i},{name:/o/i}]},{age:{$mod:[3,1]}},{score:{$not:{$gt:80}}}]})
  20. // 查询结果:查询sqlsrver一条数据

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

04   排序 

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

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

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

实例:

  1. // 查询score大86的数据,查询结果按照from降序score升序排列
  2.  
  3. db.user.find({score:{$gte:80}}).sort({from:-1,score:1})
  4.  
  5. // 查询结果的数据顺序为:mysql、mongdb、程序员修炼之旅
  6.  
  7. //将上述查询按照from升序score降序排列
  8.  
  9. db.user.find({score:{$gte:80}}).sort({from:1,score:-1})
  10.  
  11. // 查询结果的数据顺序为:程序员修炼之旅、mongdb、mysql

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

05     分页查询

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

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

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

  分页查询语法格式:

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

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

06     求和

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

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

  1. // 查询 from不等于CTU的数据同条数
  2. db.user.find({from:{$not:{$eq:"CTU"}}}).count()
  3. // 查询结果为 4
  4. db.user.find({from:{$not:{$eq:"CTU"}}}).count(true)
  5. // 查询结果为 4
  6.  
  7. // 当查询使用skip跳过第一条数时,获取数据总条数
  8. db.user.find({from:{$not:{$eq:"CTU"}}}).skip(1).count()
  9. // 查询结果为 4
  10. db.user.find({from:{$not:{$eq:"CTU"}}}).skip(1).count(true)
  11. // 查询结果为 3 正常情况下,这才是我们想要的结果
  12.  
  13. // 当查询使用limit限制查询数据时,获取数据总条数
  14. db.user.find({from:{$not:{$eq:"CTU"}}}).limit(2).count()
  15. // 查询结果为 4
  16. db.user.find({from:{$not:{$eq:"CTU"}}}).limit(2).count(true)
  17. // 查询结果为 2 正常情况下,这才是我们想要的结果

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

07     小结

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

我叫Mongo,干了「查询终结篇」,值得您拥有的更多相关文章

  1. 我叫Mongo,收了「查询基础篇」,值得你拥有

    这是mongo第二篇「查询基础篇」,后续会连续更新6篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流. 通过上一篇基础篇的介 ...

  2. 我叫Mongo,干了「索引探索篇」提升我的效率,值得您拥有

    这是mongo第四篇"索引探索",后续会连续更新4篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流.通过 ...

  3. 「MySQL高级篇」MySQL锁机制 && 事务

    大家好,我是melo,一名大三后台练习生,最近赶在春招前整理整理发过的博客~! 引言 锁锁锁,到哪到离不开这桩琐事,并发琐事,redis琐事,如今是MySQL琐事,这其中琐事,还跟MySQL另一个重要 ...

  4. 「MySQL高级篇」MySQL之MVCC实现原理&&事务隔离级别的实现

    大家好,我是melo,一名大三后台练习生,死去的MVCC突然开始拷打我! 引言 MVCC,非常顺口的一个词,翻译起来却不是特别顺口:多版本并发控制. 其中多版本是指什么呢?一条记录的多个版本. 并发控 ...

  5. 「 MySQL高级篇 」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  6. 「MySQL高级篇」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  7. 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

    大家好,我是melo,一名大三后台练习生 专栏回顾 索引的原理&&设计原则 欢迎关注本专栏:MySQL高级篇 本篇速览 在我们上一篇文章中,讲到了索引的原理&&设计原则 ...

  8. AS技巧合集「调试技巧篇」

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254726&extra=page%3D2%26filter%3Dautho ...

  9. AS技巧合集「编码技巧篇」

    转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=254725&extra=page%3D2%26filter%3Dautho ...

随机推荐

  1. Jmeter之『多变量循环』

    假设存在两个参数a,b,需要在一个循环内,同时遍历a_1,a_2,a_3,b_1,b_2,b_3 添加一个循环控制器,循环次数为变量的大小 添加一个计数器,引用名称为index(用于拼接变量名称) 同 ...

  2. Dockerize ASP。净样板项目

    Get the source code from the Github repository. 介绍 在这篇文章中,我将一步步地向你展示如何在Docker上运行ABP模块零核心模板.然后,我们将讨论其 ...

  3. 第3天 | 12天搞定Python,用PyCharm编写代码

    有了运行环境还不够,在程序的江湖里,还得有一把趁手的"兵器". 工欲善其事,必先利其器,在进行Python开发时,可选择 IDE挺多的,其中,以PyCharm. Eclipse+P ...

  4. [java进阶]关于多线程的知识点

    线程和进程的区别? 进程: 是程序得一次之星过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序就是从一个进程的创建开始,到进程的结束的过程. 在java中当我们的main函数运行时就是 ...

  5. 2014年 实验五 Internet与网络工具的使用

    实验五 Internet与网络工具的使用 [实验目的]   ⑴.FTP服务器的架设和客户端的使用. ⑵.使用云盘和云笔记应用 ⑶.运用QQ的远程协助功能. (4).默认安装foxmail软件,进行邮件 ...

  6. Redis的介绍以及安装

       redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库,缓存和消息中间件 高速缓存介绍 高速缓存利用内存保存数据,读写速度远超硬盘 高速缓存可以减少 I/O 操作,降 ...

  7. Elasticsearch索引的操作,利用kibana 创建/删除一个es的索引及mapping映射

    索引的创建及删除 1. 通过索引一篇文档创建了一个新的索引 .这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射. 利用Kibana提供的DevTools来执行命令,要创建一个索引 ...

  8. CentOS 7系统常见快捷键操作方式

    快捷键操作方式 Linux系统中一些常见的快捷方式,可有效提高操作效率,在某些时刻也能避免操作失误带来的问题. 最有用的快捷键 序号 快捷键 官方说明 掌握程度 01 Tab 命令或路径等的补全键 移 ...

  9. spring-boot-route(十八)spring-boot-adtuator监控应用

    Spring Boot提供了良好的服务监控模块,只需要通过简单的配置便可以完成服务监控和管理.但是服务监控这块内容往往是最容易被忽略的一块内容,今天我们一起来学习一下使用spring-boot-act ...

  10. sublime破解 mac版本下载

    date: "2020-10-18T10:03:01+08:00" title: "sublime破解 mac版本下载" tags: ["sublim ...