mongodb原生查询
// 根据条件、投影查询指定集合,返回游标 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字段不显示,其他字段都要显示,这句话是有矛盾的
复制代码
mongoose中的查询
<Model>.findById(id); // 按照id查询单条数据
<Model>.findOne(filter, projection); // 根据条件和投影查询单条数据
<Model>.find(filter, projection); // 根据条件和投影查询多条数据
复制代码
findOne
和find
如果没有给予回调或等待,则不会真正的进行查询,而是返回一个DocumentQuery
对象,可以通过DocumentQuery
对象进行链式调用进一步获取结果,直到传入了回调、等待、调用exec
时,才会真正执行。
链式调用中包括:
count
limit
skip
sort
和mongo的使用方式一样