使用npm安装Mongoose
安装Node.js和npm
在安装Mongoose之前,需要确保系统中已经安装了Node.js和npm。Node.js是一个基于Chrome V8引擎的JavaScript运行时,而npm是Node.js的包管理器。可以通过以下命令检查是否已安装:
node -v
npm -v
如果未安装,可以从Node.js官网下载并安装最新版本。安装完成后,npm会自动包含在内。
初始化项目
创建一个新目录并初始化Node.js项目:
mkdir mongoose-demo
cd mongoose-demo
npm init -y
这会生成一个package.json
文件,记录项目的依赖和配置信息。
安装Mongoose
使用npm安装Mongoose非常简单,只需运行以下命令:
npm install mongoose
这会自动下载最新稳定版本的Mongoose,并将其添加到package.json
的dependencies中。如果想安装特定版本,可以指定版本号:
npm install mongoose@6.0.0
验证安装
安装完成后,可以通过以下方式验证Mongoose是否成功安装:
// test.js
const mongoose = require('mongoose');
console.log(mongoose.version);
运行这个脚本:
node test.js
如果输出了Mongoose的版本号,说明安装成功。
连接MongoDB数据库
安装好Mongoose后,就可以开始连接MongoDB数据库了。首先确保MongoDB服务正在运行,然后使用以下代码建立连接:
const mongoose = require('mongoose');
// 连接本地MongoDB数据库
mongoose.connect('mongodb://localhost:27017/myapp', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// 获取连接对象
const db = mongoose.connection;
// 监听连接成功事件
db.on('connected', () => {
console.log('MongoDB连接成功');
});
// 监听连接错误事件
db.on('error', (err) => {
console.error('MongoDB连接错误:', err);
});
定义Schema和Model
Mongoose使用Schema来定义数据结构,然后通过Schema创建Model:
// 定义用户Schema
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: {
type: String,
required: true,
unique: true
},
createdAt: {
type: Date,
default: Date.now
}
});
// 创建User模型
const User = mongoose.model('User', userSchema);
基本CRUD操作
创建文档
// 创建新用户
const newUser = new User({
name: '张三',
age: 25,
email: 'zhangsan@example.com'
});
// 保存到数据库
newUser.save()
.then(doc => {
console.log('用户创建成功:', doc);
})
.catch(err => {
console.error('创建用户失败:', err);
});
查询文档
// 查询所有用户
User.find()
.then(users => {
console.log('所有用户:', users);
});
// 条件查询
User.findOne({ name: '张三' })
.then(user => {
console.log('找到的用户:', user);
});
更新文档
// 更新用户年龄
User.updateOne({ name: '张三' }, { age: 26 })
.then(result => {
console.log('更新结果:', result);
});
删除文档
// 删除用户
User.deleteOne({ name: '张三' })
.then(result => {
console.log('删除结果:', result);
});
高级查询
Mongoose提供了丰富的查询方法:
// 分页查询
User.find()
.skip(10) // 跳过前10条
.limit(5) // 返回5条
.sort({ createdAt: -1 }) // 按创建时间降序
.exec()
.then(users => {
console.log('分页结果:', users);
});
// 聚合查询
User.aggregate([
{ $match: { age: { $gt: 20 } } },
{ $group: { _id: null, averageAge: { $avg: "$age" } } }
])
.then(result => {
console.log('平均年龄:', result);
});
中间件和钩子
Mongoose支持在特定操作前后执行中间件函数:
userSchema.pre('save', function(next) {
console.log('即将保存用户:', this);
next();
});
userSchema.post('save', function(doc) {
console.log('用户已保存:', doc);
});
数据验证
Mongoose内置了多种验证器:
const productSchema = new mongoose.Schema({
name: {
type: String,
required: [true, '产品名称不能为空'],
minlength: [3, '名称至少3个字符'],
maxlength: [50, '名称最多50个字符']
},
price: {
type: Number,
min: [0, '价格不能为负数'],
validate: {
validator: function(v) {
return v % 0.5 === 0; // 价格必须是0.5的倍数
},
message: '价格必须是0.5的倍数'
}
}
});
索引优化
可以为常用查询字段添加索引:
userSchema.index({ email: 1 }, { unique: true }); // 唯一索引
userSchema.index({ name: 1, age: -1 }); // 复合索引
事务支持
Mongoose支持MongoDB的事务:
const session = await mongoose.startSession();
session.startTransaction();
try {
const user = await User.create([{ name: '李四' }], { session });
await Account.create([{ userId: user[0]._id, balance: 100 }], { session });
await session.commitTransaction();
} catch (error) {
await session.abortTransaction();
throw error;
} finally {
session.endSession();
}
性能优化
- 使用
lean()
返回普通JavaScript对象,减少内存占用:
User.find().lean().exec()
.then(users => {
// users是普通JS对象,不是Mongoose文档
});
- 批量操作使用
bulkWrite
:
User.bulkWrite([
{ insertOne: { document: { name: '王五' } } },
{ updateOne: { filter: { name: '李四' }, update: { age: 30 } } }
]);
常见问题解决
- 连接断开问题:
// 自动重连
mongoose.connection.on('disconnected', () => {
mongoose.connect('mongodb://localhost:27017/myapp', {
useNewUrlParser: true,
useUnifiedTopology: true,
autoReconnect: true,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 1000
});
});
- 弃用警告处理:
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
实际应用示例
构建一个简单的用户管理系统:
// app.js
const express = require('express');
const mongoose = require('mongoose');
const app = express();
// 连接数据库
mongoose.connect('mongodb://localhost:27017/user-manager', {
useNewUrlParser: true,
useUnifiedTopology: true
});
// 定义用户模型
const User = mongoose.model('User', new mongoose.Schema({
username: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true }
}));
// API路由
app.get('/users', async (req, res) => {
try {
const users = await User.find();
res.json(users);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:环境要求与依赖
下一篇:连接MongoDB数据库