① find简介
MongoDB使用find进行查询,查询结果就是返回一个文档的子集,子集包括0个到整个集合,find的第一个参数决定了要返回那些文档,这个参数是一个文档,用于指定查询条件,空的文档{}会返回集合中所有文档,如果不指定,则默认为{}
# 语法:
db.stu.find({查询条件})
例1(不指定查询条件):
例2(指定查询条件):
② 指定需要返回的键(注意:_id是默认返回的,即使不指定)
有时候我们并不想将整个文档返回,整个时候可以使用find的第二个参数来指定想要的键;
好处:这样做既可以节省传输的数据量,又能节省客户端解码文档的时间和内存消耗
# 语法:
db.stu.find({查询条件}, {指定要返回哪些键})
只返回文档的age和hobby键值对):
例2(查询name为paul的文档,但是不需要like字段)
****** 由上面两个例子可以看出,find的第二个参数,不仅可以指定返回的字段,还可以指定不需要返回的字段 ******
③ 查询条件(范围查询,或查询,取反)
查询不仅能像前面那样精确查询,还可以匹配更加复杂的条件,比如:范围,OR,或取反等
⑴ 比较操作符:"$gt", "$gte", "$lt", "$lte", "$ne"就是全部的比较操作符,分别对应,>, >=, <, <=, !=, 当然也可以将其中几个组合起来使用
例1:查询_id值大于2小于5的文档
例2:查询_id值不等于3的文档
⑵ mongoDB中有两种方式进行OR查询,"$in" 可以用来查询一个键的多个值;"$or"更通用一些,可以在多个键中查询任意的给定值
例1:查询name值为paul或者为wang的文档("$in")
例2:查询name值不为paul或者不为wang的文档("$nin")(和"$in"是相对的,相当于互相取反)
注意:"$in"是非常灵活的,可以指定不同的条件和值,比如说如果一个文档在做将文档的id值转换为其name值得过程中,这时不确定其_id是1还是"paul",那么可以使用下面的方式来查询
例3: 查询_id值为1或者为paul的文档
!!!:由上面几个例子可以看出,"$in"是存在缺陷的,其只是对一个字段来做OR的判断时比较适用,那么如果在对多个字段做OR判断怎么办呢?
上面我们提到有两种方式可以做OR判断,那么现在就要使用"$or","$or"和"$in"一样,都是接受一个数组,但是"$in"接受一个条件数组
例4:查询name为wang或者score为90的文档($or)
⑶ 取反,"$not"是元条件句,可以用在任何其他条件之上
④ 特定类型查询(null值如何查询)
⑴ 特殊值null
我们知道mongodb文档可以包含多种类型的数据,但是null值在查询中会有特殊的表现,其不仅会返回某个键为null的文档,还会返回不存在该键的文档
例:查询age值为null的文档
这显然不是我们想要的)
那么如果要查询age为null的文档该怎么办呢?????
不仅要检查该键的值为null,还要判断该键是否存在!!!!!!!
上面使用$in看上去有点令人费解,我们还可以使用$eq,如下
⑤ 查询数组
⑴ 查询数组元素
查询数组元素和查询标量是一样的
例:查询hobby对应数组中有game的集合(和查询hobby键对一个某个值的操作一样)
⑵ 通过多个元素匹配数组 $all
例: 查询hobby对应数组中有meat和fruit的集合
⑶ 查询数组特定位置的元素所对应的集合(下标也是从0开始)
例:查询hobby集合中第1个元素为fruit的集合
⑷ 查询数组长度
例: 查询hobby多对应数组长度为3的集合
⑥ 查询内嵌文档 (.语法)
例:查询msg中addr的值为456的文档
⑦ 限制返回结果(limit)
例:查询所有结果返回三个
⑧ 略过xx过(skip)
例:查询所有并略过前3个
注意:略过数据过多的话会影响性能
那么如何解决这种问题呢:
1,以某个键排序,查询第一页的数据
2,后续查询条件则使用第一页最后一个文档的排序键值为条件进行查询
⑨ 指定键排序(可以指定多个)
例:查询所有文档,并以name值正序排列(正序1,倒叙-1)
注意:有时候一个键对应的值是多种类型,这时如果对其进行排序,其排序顺序是预先定义好的:
最小值 < nul l< 数字 < 字符串 < 对象/文档 < 数组 < 二进制数据 < 对象ID < 布尔值 < 日期型 < 时间戳 < 正则表达式 < 最大值