Mongoose

2023年05月03日 16:08 · 阅读(104) ·

开发环境

名称 版本
操作系统 Windows 10 X64
Node.js v18.16.0
VSCode 1.77.3
MongoDB 4.2.24
Mongoose 7.1.0

源码

Mongoose.zip

安装 VSCode

下载安装 VSCode

安装 Node.js

Node.js

下载完毕后,运行 node-v18.16.0-x64.msi,一直下一步到安装完成即可

管理员方式打开 VSCode 终端

终端-新建终端

输入 node -vnpm -v 有结果说明 Node.js 安装成功

  1. PS D:\Study-前端\Code\2023\Mongoose> node -v
  2. v18.16.0
  3. PS D:\Study-前端\Code\2023\Mongoose> npm -v
  4. 9.5.1

安装 MongoDB

安装 MongoDB

Mongoose 文档

https://mongoosejs.com/docs/guide.html

Mongoose 简介

Mongoose 简介

● 之前我们都是通过 shell 来完成对数据库的各种操作的,在开发中大部分时候我们都需要通过程序来完成对数据库的操作。
● 而 Mongoose 就是一个让我们可以通过 Node 来操作 MongoDB 的模块。
Mongoose 是一个对象文档模型(ODM)库,它对 Node 原生的 MongoDB 模块进行了进一步的优化封装,并提供了更多的功能。
● 在大多数情况下,它被用来把结构化的模式应用到一个MongoDB 集合,并提供了验证和类型转换等好处

Mongoose 的好处
● 可以为文档创建一个模式结构(Schema)
● 可以对模型中的对象/文档进行验证
● 数据可以通过类型转换转换为对象模型
● 可以使用中间件来应用业务逻辑挂钩
● 比 Node 原生的 MongoDB 驱动更容易

Mongoose 新的对象

对象名称 描述
Schema(模式对象) Schema 对象定义约束了数据库中的文档结构
Model Model 对象作为集合中的所有文档的表示,
相当于 MongoDB 数据库中的集合 collection
Document Document 表示集合中的具体文档,
相当于集合中的一个具体的文档

Mongoose 下载安装

来源:Mongoose 下载安装

VSCode 终端中输入

  1. npm i mongoose --save

● 运行结果

  1. PS D:\Study-前端\Code\2023\Mongoose> npm i mongoose --save
  2. added 24 packages in 20s
  3. 1 package is looking for funding
  4. run `npm fund` for details
  5. npm notice
  6. npm notice New minor version of npm available! 9.5.1 -> 9.6.5
  7. npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.6.5
  8. npm notice Run npm install -g npm@9.6.5 to update!
  9. npm notice

安装完成,目录结构如下

package.json 内容如下,表示当前 Mongoose 版本为 7.1.0

  1. {
  2. "dependencies": {
  3. "mongoose": "^7.1.0"
  4. }
  5. }

Mongoose 连接 MongoDB

● 新建文件 01.helloMongoose.js

  1. //引入
  2. const mongoose = require("mongoose");
  3. //连接数据库
  4. mongoose.connect("mongodb://127.0.0.1:27017/test")
  5. .then(()=> console.log('数据库连接成功'))
  6. .catch(err => console.log(err, '数据库连接失败'));
  7. //断开数据库连接
  8. mongoose.disconnect();

● 运行 \01.helloMongoose.js 文件, VSCode 终端中输入

  1. node .\01.helloMongoose.js

报错 MongooseServerSelectionError

  1. MongooseServerSelectionError: Server at 127.0.0.1:27017 reports maximum wire version 4, but this version of the Node.js Driver requires at least 6 (MongoDB 3.6)
  2. at _handleConnectionErrors (D:\Study-前端\Code\2023\Mongoose\node_modules\mongoose\lib\connection.js:792:11)
  3. at NativeConnection.openUri (D:\Study-前端\Code\2023\Mongoose\node_modules\mongoose\lib\connection.js:767:11) {
  4. reason: TopologyDescription {
  5. type: 'Unknown',
  6. servers: Map(1) { '127.0.0.1:27017' => [ServerDescription] },
  7. stale: false,
  8. compatible: true,
  9. heartbeatFrequencyMS: 10000,
  10. localThresholdMS: 15,
  11. setName: null,
  12. maxElectionId: null,
  13. maxSetVersion: null,
  14. commonWireVersion: 0,
  15. logicalSessionTimeoutMinutes: null
  16. },
  17. code: undefined

报错解决

● 错误原因是我的 MongoDB 版本为 3.2.4 X64
● 解决办法:下载 MongoDB 版本为 4.2.24

再次运行 js

VSCode 终端中输入

  1. node .\01.helloMongoose.js

● 运行结果

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\01.helloMongoose.js
  2. 数据库连接成功

Mongoose 中的 Schema 和 Model

来源:Mongoose 中的 Schema 和 Model

● 创建文件 02.mongoose_demo.js

  1. //引入
  2. const mongoose = require("mongoose");
  3. //连接数据库
  4. mongoose.connect("mongodb://127.0.0.1:27017/test")
  5. .then(() => console.log('数据库连接成功'))
  6. .catch(err => console.log(err, '数据库连接失败'));
  7. //将 mongoose.Schema 赋值给一个变量
  8. var Schema = mongoose.Schema;
  9. //创建 Schema(模式) 对象
  10. var stuShema = new Schema({
  11. name: String,
  12. age: Number,
  13. gender: {
  14. type: String,
  15. default: "女"
  16. }
  17. });
  18. //通过 Schema(模式) 创建 Model
  19. //Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
  20. //集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
  21. //约束对象 stuShema
  22. var StuModel = mongoose.model("stu",stuShema);
  23. //向数据库中插入一个文档
  24. //StuModel.create(doc,function(err){});
  25. StuModel.create({
  26. name: "嫦娥",
  27. age: 33
  28. });
  29. //断开数据库连接
  30. //mongoose.disconnect();

VSCode 终端运行 node .\02.mongoose_demo.js

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\02.mongoose_demo.js
  2. 数据库连接成功

● Navicat 中查询数据

  1. db.stus.find({name:"嫦娥"});

● 查询结果

  1. // 1
  2. {
  3. "_id": ObjectId("645224c5222506188caa031a"),
  4. "name": "嫦娥",
  5. "age": NumberInt("33"),
  6. "gender": "女",
  7. "__v": NumberInt("0")
  8. }

Mongoose 中 Model 的方法

来源:Model 的方法
文档:https://mongoosejs.com/docs/api/model.html

添加

参考:添加案例

查询

● 创建文件 03.model.js

  1. (async () => {
  2. //引入
  3. const mongoose = require("mongoose");
  4. //连接数据库
  5. mongoose.connect("mongodb://127.0.0.1:27017/test")
  6. .then(() => console.log('数据库连接成功'))
  7. .catch(err => console.log(err, '数据库连接失败'));
  8. //将 mongoose.Schema 赋值给一个变量
  9. var Schema = mongoose.Schema;
  10. //创建 Schema(模式) 对象
  11. var stuShema = new Schema({
  12. name: String,
  13. age: Number,
  14. gender: {
  15. type: String,
  16. default: "女"
  17. }
  18. });
  19. //通过 Schema(模式) 创建 Model
  20. //Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
  21. //集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
  22. //约束对象 stuShema
  23. var StuModel = mongoose.model("stu",stuShema);
  24. //第一个参数:查询条件
  25. //第二个参数:投影,需要获取到的字段 {name:1,age:0} 或者
  26. //通过 find() 返回的结果,返回的对象,就是 Document 文档对象
  27. //Document 对象是 Model 的实例
  28. let result = await StuModel.find({},"name age gender", { skip: 1,limit:2 });
  29. console.log(result);
  30. })();

VSCode 终端运行 node .\03.model.js

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\03.model.js
  2. 数据库连接成功
  3. [
  4. {
  5. _id: new ObjectId("64521bf9020646317c002c74"),
  6. name: '猪八戒2',
  7. age: 29,
  8. gender: '男'
  9. },
  10. {
  11. _id: new ObjectId("64521bf9020646317c002c75"),
  12. name: '猪八戒3',
  13. age: 30,
  14. gender: '男'
  15. }
  16. ]

修改

● 创建文件 03.model.js

  1. (async () => {
  2. //引入
  3. const mongoose = require("mongoose");
  4. //连接数据库
  5. mongoose.connect("mongodb://127.0.0.1:27017/test")
  6. .then(() => console.log('数据库连接成功'))
  7. .catch(err => console.log(err, '数据库连接失败'));
  8. //将 mongoose.Schema 赋值给一个变量
  9. var Schema = mongoose.Schema;
  10. //创建 Schema(模式) 对象
  11. var stuShema = new Schema({
  12. name: String,
  13. age: Number,
  14. gender: {
  15. type: String,
  16. default: "女"
  17. }
  18. });
  19. //通过 Schema(模式) 创建 Model
  20. //Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
  21. //集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
  22. //约束对象 stuShema
  23. var StuModel = mongoose.model("stu",stuShema);
  24. const res = await StuModel.updateOne({name:"嫦娥"},{$set:{age:20}});
  25. console.log(res.matchedCount);
  26. })();

VSCode 终端运行 node .\03.model.js

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\03.model.js
  2. 数据库连接成功
  3. 1

删除

● 创建文件 03.model.js

  1. (async () => {
  2. //引入
  3. const mongoose = require("mongoose");
  4. //连接数据库
  5. mongoose.connect("mongodb://127.0.0.1:27017/test")
  6. .then(() => console.log('数据库连接成功'))
  7. .catch(err => console.log(err, '数据库连接失败'));
  8. //将 mongoose.Schema 赋值给一个变量
  9. var Schema = mongoose.Schema;
  10. //创建 Schema(模式) 对象
  11. var stuShema = new Schema({
  12. name: String,
  13. age: Number,
  14. gender: {
  15. type: String,
  16. default: "女"
  17. }
  18. });
  19. //通过 Schema(模式) 创建 Model
  20. //Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
  21. //集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
  22. //约束对象 stuShema
  23. var StuModel = mongoose.model("stu",stuShema);
  24. const res = await StuModel.deleteOne({name:"嫦娥"});
  25. console.log(res);
  26. })();

VSCode 终端运行 node .\03.model.js

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\03.model.js
  2. 数据库连接成功
  3. { acknowledged: true, deletedCount: 1 }

Mongoose 中 Document 的方法

来源:Document 的方法
文档:https://mongoosejs.com/docs/api/document.html

● 创建文件 04.document.js

  1. (async () => {
  2. //引入
  3. const mongoose = require("mongoose");
  4. //连接数据库
  5. mongoose.connect("mongodb://127.0.0.1:27017/test")
  6. .then(() => console.log('数据库连接成功'))
  7. .catch(err => console.log(err, '数据库连接失败'));
  8. //将 mongoose.Schema 赋值给一个变量
  9. var Schema = mongoose.Schema;
  10. //创建 Schema(模式) 对象
  11. var stuShema = new Schema({
  12. name: String,
  13. age: Number,
  14. gender: {
  15. type: String,
  16. default: "女"
  17. }
  18. });
  19. //通过 Schema(模式) 创建 Model
  20. //Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
  21. //集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
  22. //约束对象 stuShema
  23. var StuModel = mongoose.model("stu",stuShema);
  24. //第一个参数:查询条件
  25. //第二个参数:投影,需要获取到的字段 {name:1,age:0} 或者
  26. //通过 find() 返回的结果,返回的对象,就是 Document 文档对象
  27. //Document 对象是 Model 的实例
  28. let doc = await StuModel.findOne({name:"白骨精1"});
  29. //修改数据
  30. // doc.name = "白骨精1";
  31. doc.set("name","白骨精1");
  32. // doc.save();
  33. //获取数据
  34. console.log(doc.get("name"));
  35. delete doc.age;
  36. console.log(doc.toJSON());
  37. })();

VSCode 终端运行 node .\04.document.js

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\04.document.js
  2. 数据库连接成功
  3. 白骨精1
  4. {
  5. _id: new ObjectId("645224834149ee80fbc7229a"),
  6. name: '白骨精1',
  7. age: 16,
  8. gender: '女',
  9. __v: 0
  10. }

Mongoose 的模块化

来源:Mongoose 的模块化

● 文件结构

● 创建 /tools/conn_mongo.js

  1. //引入
  2. const mongoose = require("mongoose");
  3. //连接数据库
  4. mongoose.connect("mongodb://127.0.0.1:27017/test")
  5. .then(() => console.log('数据库连接成功'))
  6. .catch(err => console.log(err, '数据库连接失败'));

● 创建 /models/student.js

  1. var mongoose = require("mongoose");;
  2. //将 mongoose.Schema 赋值给一个变量
  3. var Schema = mongoose.Schema;
  4. //创建 Schema(模式) 对象
  5. var stuShema = new Schema({
  6. name: String,
  7. age: Number,
  8. gender: {
  9. type: String,
  10. default: "女"
  11. }
  12. });
  13. //通过 Schema(模式) 创建 Model
  14. //Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
  15. //集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
  16. //约束对象 stuShema
  17. var StuModel = mongoose.model("stu",stuShema);
  18. //调用:var StuModel = require("./models/student").model;
  19. //export.model = StuModel;
  20. //调用:var StuModel = require("./models/student");
  21. module.exports = StuModel;

● 创建 /05.index.js

  1. //数据库连接
  2. require("./tools/conn_mongo");
  3. //获取 model
  4. var StuModel = require("./models/student");
  5. (async () => {
  6. //第一个参数:查询条件
  7. //第二个参数:投影,需要获取到的字段 {name:1,age:0} 或者
  8. //通过 find() 返回的结果,返回的对象,就是 Document 文档对象
  9. //Document 对象是 Model 的实例
  10. let result = await StuModel.find({},"name age gender", { skip: 1,limit:2 });
  11. console.log(result);
  12. })();

VSCode 终端运行 node .\05.index.js

  1. PS D:\Study-前端\Code\2023\Mongoose> node .\05.index.js
  2. 数据库连接成功
  3. [
  4. {
  5. _id: new ObjectId("64521bf9020646317c002c74"),
  6. name: '猪八戒2',
  7. age: 29,
  8. gender: '男'
  9. },
  10. {
  11. _id: new ObjectId("64521bf9020646317c002c75"),
  12. name: '猪八戒3',
  13. age: 30,
  14. gender: '男'
  15. }
  16. ]