补充
- mongoodb 操作
VS
mongoose 操作
- mongodb 的备份与恢复
# 恢复 mongorestore -d <dbname> <backupDir> # 备份 mongodump -d <dbname> -o <backupDir>
mongodb 原生查询
语法
-
根据条件、投影查询指定集合,返回游标
db.<collection>.find([filter], [projection]);
-
查询返回的是一个游标对象,它类似于迭代器,可以在查询结果中进行迭代
-
cursor 的成员:
next()
:游标向后移动,并返回下一个结果,如果没有结果则报错hasNext()
:判断游标是否还能向后移动,返回 booleanskip(n)
:跳过前面的 n 条数据,返回 cursorlimit(n)
:取当前结果的 n 条数据,返回 cursorsort(sortObj)
:按照指定的条件排序,返回 cursorcount()
:得到符合 filter 的结果数量,返回 Numbersize()
:得到最终结果的数量,返回 Number
-
由于某些函数会继续返回 cursor ,因此可以对其进行链式编程,返回 cursor 的函数成为了链中的一环,无论它们的调用顺序如何,始终按照下面的顺序执行:
sort -> skip -> limit
查询条件
-
比较运算符
名称 描述 $eq 匹配 = 指定值的值 $gt 匹配 > 指定值的值 $gte 匹配 >= 指定值的值 $in 匹配数组中指定的任何值 $lt 匹配 < 指定值的值 $lte 匹配 <= 指定值的值 $ne 匹配所有 !== 指定值的值 $nin 不匹配数组中指定的任何值 -
逻辑运算符
名称 描述 $and 将查询子句与逻辑连接,并返回与这两个子句条件匹配的所有文档 $not 反转查询表达式的效果,并返回与查询表达式不匹配的文档 $nor 用逻辑 NOR 连接查询子句,返回所有不能匹配这两个子句的文档 $or 用逻辑连接查询子句,或返回与任一子句条件匹配的所有文档 -
案例
// 查询所有 name="曹敏" 的用户 db.user.find({ name: "曹敏" }); // 查询所有 loginId 以 7 结尾 并且 name 包含 敏 的用户 db.user.find({ loginId: /7$/, name: /敏/ }); // 查询所有 loginId 以 7 结尾 或者 name 包含 敏 的用户 db.user.find({ $or: [ { loginId: /7$/, }, { name: /敏/ }, ], }); // 查询所有年龄等于18 或 20 或 25 的用户 db.user.find({ age: { $in: [18, 20, 25] } }); // 查询所有年龄不等于18 或 20 或 25 的用户 db.user.find({ age: { $nin: [18, 20, 25] } }); // 查询所有年龄在 20~30 之间的用户 db.user.find({ age: { $gt: 20, $lt: 30 } }); // 查询所有第一个爱好是音乐的用户 db.user.find({ "loves.0": "音乐" }); // 查询所有居住城市是重庆的用户 db.user.find({ "address.city": /重庆/ }); // 查询将匹配包含其值为 null 或不包含 name 字段的文档 db.user.find({ name: null }) // 查询仅匹配 包含 name 字段值为 null 的文档,name 字段的值为 BSON 类型为 Null(类型编号10) db.user.find({ name: { $type: 10 } }) // 查询与 不包含 name 字段的文档匹配 db.user.find({ name: { $exists: false } })
投影
-
find 中的第二个参数 projection 表示投影,类似于 mysql 中的 select;
-
它是一个对象,表达了哪些字段需要投影到查询结果中,哪些不需要
// 查询结果中仅包含 name、age,以及会自动包含的 _id db.user.find( {}, { name: 1, age: 1 } ); // 查询结果不能包含 loginPwd、age,其他的都要包含 db.user.find( {}, { loginPwd: 0, age: 0 } ); // 查询结果中仅包含 name、age,不能包含_id db.user.find( {}, { name: 1, age: 1, _id: 0 } ); // 错误:除了 _id 外,其他的字段不能混合编写 db.user.find( {}, { name: 1, age: 0 } );
mongoose 中的查询
语法
API | 描述 |
---|---|
<Model>.findById(id) | 按照 id 查询单条数据 |
<Model>.findOne(filter, projection) | 根据条件和投影查询单条数据 |
<Model>.find(filter, projection) | 根据条件和投影查询多条数据 |
-
findOne 和 find 如果没有给予回调或等待,则不会真正的进行查询,而是返回一个 DocumentQuery 对象,可以通过 DocumentQuery 对象进行链式调用进一步获取结果,直到传入了回调、等待、调用 exec 时,才会真正执行;
-
链式调用中包括:
- count
- limit
- skip
- sort
差异点
-
count 得到的是当前结果的数量
-
查询 id 时,使用字符串即可
const result = await User.findById( '5ed093872e3da2b654983476', { name: 1, age: 1, } );
-
projection 支持字符串写法
// 等价于 { address: 0, loves: 0 } const result = await User.findById( '5ed093872e3da2b654983476', "-address -loves" );
-
sort 支持字符串写法
const result = await User.findById( '5ed093872e3da2b654983476', "name age" ) .sort('age'); // age 升序,-age 降序
-
populate 支持关联查询(不建议)
MongoDB👉 创建文档
上一篇