开发环境
名称 | 版本 |
---|---|
操作系统 | Windows 10 X64 |
Node.js | v18.16.0 |
VSCode | 1.77.3 |
MongoDB | 4.2.24 |
Mongoose | 7.1.0 |
源码
安装 VSCode
安装 Node.js
下载完毕后,运行 node-v18.16.0-x64.msi
,一直下一步到安装完成即可
以管理员方式
打开 VSCode
终端
终端
-新建终端
输入 node -v
,npm -v
有结果说明 Node.js
安装成功
PS D:\Study-前端\Code\2023\Mongoose> node -v
v18.16.0
PS D:\Study-前端\Code\2023\Mongoose> npm -v
9.5.1
安装 MongoDB
Mongoose 文档
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 下载安装
VSCode
终端中输入
npm i mongoose --save
● 运行结果
PS D:\Study-前端\Code\2023\Mongoose> npm i mongoose --save
added 24 packages in 20s
1 package is looking for funding
run `npm fund` for details
npm notice
npm notice New minor version of npm available! 9.5.1 -> 9.6.5
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.6.5
npm notice Run npm install -g npm@9.6.5 to update!
npm notice
安装完成,目录结构如下
package.json
内容如下,表示当前 Mongoose
版本为 7.1.0
{
"dependencies": {
"mongoose": "^7.1.0"
}
}
Mongoose 连接 MongoDB
● 新建文件 01.helloMongoose.js
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(()=> console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//断开数据库连接
mongoose.disconnect();
● 运行 \01.helloMongoose.js
文件, VSCode
终端中输入
node .\01.helloMongoose.js
报错 MongooseServerSelectionError
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)
at _handleConnectionErrors (D:\Study-前端\Code\2023\Mongoose\node_modules\mongoose\lib\connection.js:792:11)
at NativeConnection.openUri (D:\Study-前端\Code\2023\Mongoose\node_modules\mongoose\lib\connection.js:767:11) {
reason: TopologyDescription {
type: 'Unknown',
servers: Map(1) { '127.0.0.1:27017' => [ServerDescription] },
stale: false,
compatible: true,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
setName: null,
maxElectionId: null,
maxSetVersion: null,
commonWireVersion: 0,
logicalSessionTimeoutMinutes: null
},
code: undefined
报错解决
● 错误原因是我的 MongoDB
版本为 3.2.4 X64
● 解决办法:下载 MongoDB 版本为 4.2.24
再次运行 js
● VSCode
终端中输入
node .\01.helloMongoose.js
● 运行结果
PS D:\Study-前端\Code\2023\Mongoose> node .\01.helloMongoose.js
数据库连接成功
Mongoose 中的 Schema 和 Model
● 创建文件 02.mongoose_demo.js
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建 Schema(模式) 对象
var stuShema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "女"
}
});
//通过 Schema(模式) 创建 Model
//Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
//集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
//约束对象 stuShema
var StuModel = mongoose.model("stu",stuShema);
//向数据库中插入一个文档
//StuModel.create(doc,function(err){});
StuModel.create({
name: "嫦娥",
age: 33
});
//断开数据库连接
//mongoose.disconnect();
● VSCode
终端运行 node .\02.mongoose_demo.js
PS D:\Study-前端\Code\2023\Mongoose> node .\02.mongoose_demo.js
数据库连接成功
● Navicat 中查询数据
db.stus.find({name:"嫦娥"});
● 查询结果
// 1
{
"_id": ObjectId("645224c5222506188caa031a"),
"name": "嫦娥",
"age": NumberInt("33"),
"gender": "女",
"__v": NumberInt("0")
}
Mongoose 中 Model 的方法
添加
参考:添加案例
查询
● 创建文件 03.model.js
(async () => {
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建 Schema(模式) 对象
var stuShema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "女"
}
});
//通过 Schema(模式) 创建 Model
//Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
//集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
//约束对象 stuShema
var StuModel = mongoose.model("stu",stuShema);
//第一个参数:查询条件
//第二个参数:投影,需要获取到的字段 {name:1,age:0} 或者
//通过 find() 返回的结果,返回的对象,就是 Document 文档对象
//Document 对象是 Model 的实例
let result = await StuModel.find({},"name age gender", { skip: 1,limit:2 });
console.log(result);
})();
● VSCode
终端运行 node .\03.model.js
PS D:\Study-前端\Code\2023\Mongoose> node .\03.model.js
数据库连接成功
[
{
_id: new ObjectId("64521bf9020646317c002c74"),
name: '猪八戒2',
age: 29,
gender: '男'
},
{
_id: new ObjectId("64521bf9020646317c002c75"),
name: '猪八戒3',
age: 30,
gender: '男'
}
]
修改
● 创建文件 03.model.js
(async () => {
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建 Schema(模式) 对象
var stuShema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "女"
}
});
//通过 Schema(模式) 创建 Model
//Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
//集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
//约束对象 stuShema
var StuModel = mongoose.model("stu",stuShema);
const res = await StuModel.updateOne({name:"嫦娥"},{$set:{age:20}});
console.log(res.matchedCount);
})();
● VSCode
终端运行 node .\03.model.js
PS D:\Study-前端\Code\2023\Mongoose> node .\03.model.js
数据库连接成功
1
删除
● 创建文件 03.model.js
(async () => {
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建 Schema(模式) 对象
var stuShema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "女"
}
});
//通过 Schema(模式) 创建 Model
//Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
//集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
//约束对象 stuShema
var StuModel = mongoose.model("stu",stuShema);
const res = await StuModel.deleteOne({name:"嫦娥"});
console.log(res);
})();
● VSCode
终端运行 node .\03.model.js
PS D:\Study-前端\Code\2023\Mongoose> node .\03.model.js
数据库连接成功
{ acknowledged: true, deletedCount: 1 }
Mongoose 中 Document 的方法
来源:Document 的方法
文档:https://mongoosejs.com/docs/api/document.html
● 创建文件 04.document.js
(async () => {
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建 Schema(模式) 对象
var stuShema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "女"
}
});
//通过 Schema(模式) 创建 Model
//Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
//集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
//约束对象 stuShema
var StuModel = mongoose.model("stu",stuShema);
//第一个参数:查询条件
//第二个参数:投影,需要获取到的字段 {name:1,age:0} 或者
//通过 find() 返回的结果,返回的对象,就是 Document 文档对象
//Document 对象是 Model 的实例
let doc = await StuModel.findOne({name:"白骨精1"});
//修改数据
// doc.name = "白骨精1";
doc.set("name","白骨精1");
// doc.save();
//获取数据
console.log(doc.get("name"));
delete doc.age;
console.log(doc.toJSON());
})();
● VSCode
终端运行 node .\04.document.js
PS D:\Study-前端\Code\2023\Mongoose> node .\04.document.js
数据库连接成功
白骨精1
{
_id: new ObjectId("645224834149ee80fbc7229a"),
name: '白骨精1',
age: 16,
gender: '女',
__v: 0
}
Mongoose 的模块化
● 文件结构
● 创建 /tools/conn_mongo.js
//引入
const mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/test")
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
● 创建 /models/student.js
var mongoose = require("mongoose");;
//将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建 Schema(模式) 对象
var stuShema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "女"
}
});
//通过 Schema(模式) 创建 Model
//Model 代表的是数据库中的集合,通过 Model 才能对数据库进行操作
//集合名 stu:Mongoose 会自动将集合名 stu 变成复数 stus
//约束对象 stuShema
var StuModel = mongoose.model("stu",stuShema);
//调用:var StuModel = require("./models/student").model;
//export.model = StuModel;
//调用:var StuModel = require("./models/student");
module.exports = StuModel;
● 创建 /05.index.js
//数据库连接
require("./tools/conn_mongo");
//获取 model
var StuModel = require("./models/student");
(async () => {
//第一个参数:查询条件
//第二个参数:投影,需要获取到的字段 {name:1,age:0} 或者
//通过 find() 返回的结果,返回的对象,就是 Document 文档对象
//Document 对象是 Model 的实例
let result = await StuModel.find({},"name age gender", { skip: 1,limit:2 });
console.log(result);
})();
● VSCode
终端运行 node .\05.index.js
PS D:\Study-前端\Code\2023\Mongoose> node .\05.index.js
数据库连接成功
[
{
_id: new ObjectId("64521bf9020646317c002c74"),
name: '猪八戒2',
age: 29,
gender: '男'
},
{
_id: new ObjectId("64521bf9020646317c002c75"),
name: '猪八戒3',
age: 30,
gender: '男'
}
]