// 根据条件、投影查询指定集合,返回游标 cursor db.<collection>.find([filter], [projection]); 复制代码
查询返回的是一个游标对象,它类似于迭代器,可以在查询结果中进行迭代
cursor
的成员:
next()
:游标向后移动,并返回下一个结果,如果没有结果则报错hasNext()
:判断游标是否还能向后移动,返回boolean
这个游标不会移动哦,只会判断游标的下一个是否可以移动
skip(n)
:去前面的n
条数据,返回cursor
limit(n)
:取当前结果的n
条数据,返回cursor
sort(sortObj)
:按照指定的条件排序,返回cursor
排序中,1是正序, -1是倒序
count()
:得到符合filter
的结果数量,返回Number
size()
:得到最终结果的数量,返回Number
由于某些函数会继续返回cursor
,因此可以对其进行链式编程,返回cursor
的函数成为了链中的一环,无论它们的调用顺序如何,结果都是一样的:
执行的结果如下:
sort -> skip -> limit 复制代码
find
函数的第一个参数是查询条件filter
,它的写法极其丰富,下面列举了大部分情况下我们可能使用到的写法。
// 查询所有 name="twinkle" 的用户 { name: "twinkle" } // 查询所有 stuNo 以 1 结尾 并且 name 包含 tw 的用户 { stuNo: /1$/ , name: /tw/ } // 查询所有 stuNo 以 1 结尾 或者 name 包含 mar 的用户 { $or: [ { stuNo: /1$/, }, { name: /mar/ }, ], } // 查询所有年龄等于18 或 20 的用户 { age: { $in: [18, 20] } } // 查询所有年龄不等于18 或 20 或 25 的用户 { age: { $nin: [18, 20] } } // 查询所有年龄在 20~30 之间的用户 { age: { $gt: 20, $lt: 30 } } 复制代码
查询中出现了一些特殊的属性,它以$
开头,表达了特殊的查询含义,这些属性称之为操作符 operator
查询中的常用操作符包括:
$or
:或者$and
:并且$in
:在…之中$nin
:不在…之中$gt
:大于$gte
:大于等于$lt
:小于$lte
:小于等于$ne
:不等于find
中的第二个参数projection
表示投影,类似于mysql
中的select
它是一个对象,表达了哪些字段需要投影到查询结果中,哪些不需要
// 查询结果中仅包含 name、age,以及会自动包含的 _id { name: 1, age: 1 } // 查询结果不能包含 loginPwd、age,其他的都要包含 { stuNo: 0, age: 0 } // 查询结果中仅包含 name、age,不能包含_id { name: 1, age: 1, _id: 0 } // 错误:除了 _id 外,其他的字段不能混合编写 { name: 1, age: 0 } // 这句话的意思是说,除了name字段要显示,其他的字段都不要显示,并且除了age字段不显示,其他字段都要显示,这句话是有矛盾的 复制代码
<Model>.findById(id); // 按照id查询单条数据 <Model>.findOne(filter, projection); // 根据条件和投影查询单条数据 <Model>.find(filter, projection); // 根据条件和投影查询多条数据 复制代码
findOne
和find
如果没有给予回调或等待,则不会真正的进行查询,而是返回一个DocumentQuery
对象,可以通过DocumentQuery
对象进行链式调用进一步获取结果,直到传入了回调、等待、调用exec
时,才会真正执行。
链式调用中包括:
count
limit
skip
sort
和mongo的使用方式一样