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 时,才会真正执行。
链式调用中包括:
和mongo的使用方式一样
小彩蛋菜单🎉
mongodb 的备份与恢复
# 恢复
mongorestore -d <dbname> <backupDir>
# 备份
mongodump -d <dbname> -o <backupDir>
复制代码
|