MongoDB 查询文档

MongoDB 查询文档

目录

find 函数:查询集合文档
db.collection.find(query, projection)
  • collection:替换成需要查询的集合名称
  • query:查询条件(可选)使用查询操作符指定查询筛选器。若要返回集合中的所有文档,请省略此参数或传递一个空文档({})
  • projection:投影结果(可选)指定要在文档中返回与查询筛选器匹配的字段。要返回匹配文档中的所有字段,请省略此参数

注意: 游标(cursor)指向匹配查询条件的文档。当find() 方法返回文档时,该方法实际上是将游标返回到文档。

findOne 函数:查看单个集合文档

查询选择器(查询操作符)

比较操作符
操作符 说明
$eq 相等
$gt 大于
$gte 大于等于
$in 包含数组元素
$lt 小于
$lte 小于等于
$ne 不等于指定值
$nin 不包含数组元素
逻辑操作符
逻辑操作符 说明
$and 多个条件同时满足
$not 反转查询表达式的效果,并返回与查询表达式不匹配的文档。
$nor 用逻辑 NOR 连接查询子句,返回所有不能匹配这两个子句的文档。
$or 只要有一个条件成立即可
元素操作符
元素操作符 说明
$exists 判断字段是否存在
$type 判断字段的类型
求值操作符
求值操作符 说明
$mod 模运算
$regex 匹配正则表达式
$where 匹配JS表达式
  • $mod
{ field: { $mod: [ divisor, remainder ] }
}
  • $regex
{ <field>: { $regex: /parttern/,$options:'<options>' } }
{ <field>: { $regex: 'parttern',$options:'<options>' } }
{ <field>: { $regex: /parttern/<options> } }

注:要在 $in 查询表达式中包含正则表达式,只能使用 JavaScript 正则表达式对象(即/pattern/)

  • $where

$where 后面跟 js 函数

> db.worker.find({$where:function() { return this.age>20;}})
数组操作符
数组操作符 说明
$all 匹配包含查询中指定的所有元素的数组
$elemMatch 如果数组字段中的元素匹配所有指定的 $elemMatch 条件则选择文档
$size 如果数组字段是指定大小则选择文档
  • $all

$all 要求数组中的元素满足所有条件

{ <field>: { $all: [ <value1> , <value2>... ] } }
  • elemMatch

$elemMatch 只要数组中有一个元素满足条件即可

{ <field>: { $elemMatch: { <query1>,<query2>, ... } } }
  • $size

投影(Projection)

投影参数决定在匹配的文档中返回哪些字段。

{ field1: <value>, field2: <value> ... }

可以是下列任何一种

  • 1 或 true:显示该字段
  • 0 或 false:不显示该字段
  • 使用投影操作符的表达式

注:_id 默认是显示的。可以手动设置不显示

注:一个document文档中除了_id 字段外,其他的所有字段只要有一个字段的投影是 0,没有显式给出的字段的投影都是1;同理其他的所有字段只要有一个字段的投影是1,没有显式给出的字段的投影都是0。

字段投影的0和1不能混合使用

投影操作符
投影操作符 说明
$ 投影满足查询条件的数组第一个元素
$elemMatch 投影符合指定 $elemMatch 条件的数组中的第一个元素
$slice 限制从数组中投影的元素数量。支持 skip 和 limit

$ 语法

db.collection.find(<array>:<value>... },{"<array>.$":1})
db.collection.find(<array.field>:<value>... },{"<array>.$":1})

注:使用了点表示法的字段必须加上引号

· 点语法

点语法使用在数组和嵌套文档中

数组中的语法

"数组.索引"

嵌套文档中的语法

"对象.字段"

游标(Cursor)

  • find 查询返回的是游标
  • 游标指向查询结果集的指针。
  • 客户端可以遍历游标来检索结果
  • 默认情况下,游标在不活动10分钟后超时
var cursor = db.worker.find()
使用游标进行迭代
var cursor = db.worker.find()
while (cursor.hasNext()){
    printjson(cursor.next());
}
forEach 语法

迭代游标,将 JavaScript 函数应用于游标中的每个文档

db.collection.find().forEach(<function>)
skip() 语法
cursor.skip(<offset>)

在游标上调用 cursor.skip() 方法来控制 MongoDB 开始返回结果的位置。这种方法在实现分页结果时可能很有用。

注意:skip 的值不能是负数

limit() 语法

db.collection.find(<query>).limit(<number>)
  • 使用游标上的 limit() 方法指定游标将返回的最大文档数。limit() 类似于 MySQL 数据库中的 limit 语句。

  • limit() 值为0 (即 limit(0) ) 等同于不设置限制。

  • limit 对于小于-231和大于231的值,limit()的行为没有定义

skip+limit 组合

skip+limit 的顺序一定是先 skip 再 limit,跟书写顺序无关

> db.worker.find().skip(1).limit(2)
# 等价于
> db.worker.find().limit(2).skip(1)

sort() 语法

cursor.sort(s)
  • s:document 类型,定义结果集排序规则(升、降序)

在 sort 参数中指定要排序的字段或值为 1 或 -1 分别指定升序或降序排序。

在比较不同BSON类型的值时,MongoDB 使用以下比较顺序,从最低到最高 :

1.	MinKey (internal type)
2.	Null
3.	Numbers (ints, longs, doubles, decimals)
4.	Symbol, String
5.	Object
6.	Array
7.	BinData
8.	ObjectId
9.	Boolean
10.	Date
11.	Timestamp
12.	Regular Expression
13.	MaxKey (internal type)

sort+skip+limit 组合

执行顺序先 sort,然后 skip,最后 limit,跟书写顺写无关。

count() 语法

db.collection.find(<query>).count()

count()方法有以下参数:

  • applySkipLimit:boolean 类型,默认为 false,可选的。指定是否在计数中考虑 cursor.skip() 和 cursor.limit() 方法的影响。默认情况下, count() 方法忽略 cursor.skip() 和 cursor.limit() 的效果,将 applySkipLimit 设置为 true,考虑这些方法的效果。

在分片集群上,如果存在孤立文档,或者正在进行块迁移,count() 可能导致不准确的计数。为了避免这些情况,在分片集群上,可以使用 db. collections .aggregate() 方法。

上一篇:sqlserve2008无法使用Offset、Limit进行分页,解决方法


下一篇:Limit讨论,K8s 使用 CPU Limit 后,服务响应变成龟速...