1,  今天我面来分享一个mongodb中的查询操作,这个可以说是我面程序里面用的最多的一个操作了find()

首先我面打开我面发的mongodb,然后像里面添加数据

aggregate查询 mongodb mongodb in查询_数据

  1. 下面我面先做一个做基础的查询

查询所有数据,语句(db.tty.find())

aggregate查询 mongodb mongodb in查询_mongodb_02

效果大家都看到了,这个很简单就不用在多说了

1,      我面说一下查询的查询器,

比如我面现在要找到age;小于7的数据

db.tty.find({age:{$lt:7}})

aggregate查询 mongodb mongodb in查询_数据库_03

比较基础的查询器有很多现在我面先列举出来

>, >=, <, <=, !=, ,OR,In,NotIn分别对应"$gt", "$gte", "$lt", "$lte", "$ne" "$or", "$in","$nin"

这样这些查询器就可以组合在一起做一些复杂的查询了,

下面我面来做几个列子说明一下这几个查询器

  1. 比如我面在查询age大于3并且小于7的数据

语句就是:db.tty.find({age:{$lt:7,$gt:3}})

aggregate查询 mongodb mongodb in查询_aggregate查询 mongodb_04

我面可以看到这个效果正是我们需要的,

哪我面如果想要查询,age大于7或者小于3的数据哪?

语句就是这样的了:db.tty.find({$or:[{age:{$gt:7}},{age:{$lt:3}}]})

aggregate查询 mongodb mongodb in查询_aggregate查询 mongodb_05

这里主要就是 "$or", 是在外边 ,没有在字段里面

例如我面想找到name是zzl0和zzl8的数据,哪我面应该怎么写哪

其实语句也很简单:db.tty.find({name:{$in:["zzl0","zzl8"]}})

aggregate查询 mongodb mongodb in查询_数据库_06

大家可以看到,这个就是我面想要的结果了,

$nin查询器,顾名思义就是和in相反的,我面也演示一下

语句为:db.tty.find({name:{$nin:["zzl0","zzl8"]}})

找出name不为zzl和zzl8的数据

aggregate查询 mongodb mongodb in查询_数组_07

下面我面来介绍一下数组操作

数组操作第一个查询器就是$all;查询所有数组中符合条件的

例如我面要查询back中 包含js2和css2的数据

db.tty.find({back:{$all:["js2","css2"]}})

aggregate查询 mongodb mongodb in查询_数组_08

但是如果我面想查询back数组中 第一个元素为js2的要怎么做哪,

语句就是这样的了

db.tty.find({"back.0":"js2"})

注意数组中的第一个元素的索引为0

aggregate查询 mongodb mongodb in查询_数组_09

第二个,按数组长度查找$size

比如我面要找到back中长度为3的数据,就可以这样写

db.tty.find({back:{$size:3}})

aggregate查询 mongodb mongodb in查询_数据_10

第三个数组查询器:就是返回数组中的指定元素

比如我面要返回name为zzl9中back字段中第一个和第二个元素

db.tty.find({name:"zzl9"},{back:{$slice:[0,2]}})

aggregate查询 mongodb mongodb in查询_数据_11

还有一个是嵌套文档查询$selemMatch,

db.tty.find({back:{$selemMatch:{ck:"zz1",cz:"lk"}}})

这个就不做演示了

下面我们来说一下数据的查询分页,和top多少条的,已经排序

Limit这个是返回条,skip:这个是返回位置,sort这个是排序

我们用一天语句来说完

比如我们要查询,age这第三条开始,后面的3条,按倒序排列

db.tty.find().limit(3).skip(3).sort({age:-1})
db.tty.find().limit(3).skip(3).sort({age:1})

一个是正序一个是倒序

aggregate查询 mongodb mongodb in查询_aggregate查询 mongodb_12

大家可以看,这个就是我们想要的结果了

下面我们简单的说一下游标和快照吧,

当我们find出来数据的时候,其实返回给我们的是一个游标,我们只有while循环来操作游标才能一条一条的弄到数据,而不能使用dom.[name]取出对象,

至于快照,主要是和mongodb中分配内存有关,当我们对一个集合find的时候,我们有改变了其中的一个文档的大小,如果这个改变的大小超出了内存预留的大小,那么mongodb就会给我们在重新分配一个,这样这个文档就会从原来的位置被移动到集合的最底部,这样的话就有可能出现,重复查询数据,和漏查数据的问题,

快照就是为了解决这个问题二诞生的

查询器是:$snapshot:true

最后我们说一下group分组操作这个在我们日常也是比较容易用到的

db.tty.group({
.. key:{name:true},
.. initial:{person:[]},
.. $reduce:function(cur,perv){
.. perv.person.push(cur.name);
.. }
.. ,
.. condition:{age:{$gt:1}}
.. })

这个这个就是以name分组查询数据

.. condition是过滤条件,age大于1的

Key这个是分组字段

Initial,每一组一个初始化文档

$reduce,在每一个文档都会执行一次

aggregate查询 mongodb mongodb in查询_aggregate查询 mongodb_13

看一下 这就是我们的结果了,好了到这里我们的查询已经分享完了