阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 使用npm安装Mongoose

使用npm安装Mongoose

作者:陈川 阅读数:61713人阅读 分类: MongoDB

安装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();
}

性能优化

  1. 使用lean()返回普通JavaScript对象,减少内存占用:
User.find().lean().exec()
  .then(users => {
    // users是普通JS对象,不是Mongoose文档
  });
  1. 批量操作使用bulkWrite
User.bulkWrite([
  { insertOne: { document: { name: '王五' } } },
  { updateOne: { filter: { name: '李四' }, update: { age: 30 } } }
]);

常见问题解决

  1. 连接断开问题:
// 自动重连
mongoose.connection.on('disconnected', () => {
  mongoose.connect('mongodb://localhost:27017/myapp', {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    autoReconnect: true,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 1000
  });
});
  1. 弃用警告处理:
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

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌