Skip to content
On this page

mongoose

简介

mongoose 是一个 MongoDB 对象模型工具,旨在在异步环境中工作。它支持 Node.js 和 Deno(alpha),提供了简单易用的 API 来与 MongoDB 进行交互。

安装

bash
npm install mongoose --save

示例

  • 连接数据库
javascript
const mongoose = require('mongoose');
const url = 'mongodb://localhost:27017/test';
// 配置
mongoose.set({
    debug: true,  //开启调试
    bufferCommands: false,  // 关闭缓存
    autoIndex: true,  // 开启索引
    id: true // 开启id虚拟值
})
mongoose.connect(url)
    .then(() => {
        console.log('数据库连接成功');
    })
    .catch((err) => {
        console.log('数据库连接失败', err);
    });
  • 定义模型
javascript
const { Schema, model } = require('mongoose');

const options = {
  //应用启动时,Mongoose 自动发送 createIndex 指令, schema 里的每个 index 都会被创建。
  // autoIndex: false,
  //缓存 最外层已经配置了
  // bufferCommands: false,
  //数据容量(单位bytes)
  // capped: 1024,
  // 默认生成 collection 的名称(生成 model 名称的复数形式)。 设置这个选项可以自定义名称。
  collection: name,
  //Mongoose 会默认生成一个虚拟值 id,指向文档的 _id 字段。 如果你不需要 id 虚拟值,可以通过这个选项禁用此功能。
  id: true,
  //Mongoose 默认给你的 Schema 赋值一个 _id。 这个值的类型是 ObjectId,这与MongoDB的默认表现一致。 如果你不需要 _id,可以通过这个选项禁用此功能。
  // Mongoose 不能保存没有id的文档,如果你硬是要这么做,会报错的哦
  // _id: true,
  //minimize 选项设为 false,Mongoose 将保存空对象。
  minimize: false,
  //如果设置了 timestamps 选项, mongoose 会在你的 schema 自动添加 createdAt 和 updatedAt 字段, 其类型为 Date。
  timestamps: {createdAt: 'createTime', updatedAt: 'updateTime'},
};

const userSchema = new Schema({
    __v: { type: Number, select: false }, // 关闭版本号
    createTime: {
        type: Date,
        get(v) {
            return new Date(v).toLocaleString(); // 格式化时间
        }
    },
    updateTime: {
        type: Date,
        get(v) {
            return new Date(v).toLocaleString(); // 格式化时间
        }
    },
    name: {
      //https://mongoose.nodejs.cn/docs/api/schema.html#Schema.Types
      type: String, //类型 String Number  Boolean Array Buffer Date Mixed ObjectId UUID BigInt
      required: true,//是否必填
      // required:[true,'name is required'],//是否必填
      unique: true,//是否唯一
      trim: true,//是否去除空格
      lowercase: true,//是否转换为小写
      uppercase: true,//是否转换为大写
      enum: ['value1', 'value2'],//是否在枚举中
      default: 'default',//默认值
      index: true,//是否索引
      sparse: true,//是否稀疏索引
      text: true,//是否全文索引
      //minlength: 6,//最小长度 String
      minlength: [6, 'name is too short'],//最小长度 String
      //maxlength: 20,//最大长度 String
      maxlength: [20, 'name is too long'],//最大长度 String
      //min: 18,//最小值 Number
      min: [18, 'age is too young'],//最小值 Number
      //max: 100,//最大值 Number
      max: [100, 'age is too old'],//最大值 Number
      get: v => Math.round(v),//获取值
      set: v => Math.round(v),//设置值
    },
}, options);
//http://mongoosejs.net/docs/guide.html#toJSON
userSchema.set('toJSON', { getters: true, virtuals: true }) //转换为json
const User = model('User', userSchema); // 创建模型
//自定义获取schema
User.$getSchema=()=>Object.keys(model('User').schema.obj)
module.exports = User;
  • 调用模型方法
javascript
const Model = require('./userSchema');

// 保存新用户
const newUser = new Model({ name: 'Alice' });
newUser.save()
    .then(() => console.log('用户保存成功'))
    .catch(err => console.error('保存失败:', err));

// 批量保存用户
Model.insertMany([{ name: 'Bob' }, { name: 'Charlie' }])
    .then(() => console.log('批量保存成功'))
    .catch(err => console.error('批量保存失败:', err));

// 更新用户
Model.findByIdAndUpdate('userId', { name: 'Updated Name' }, { new: true })
    .then(updatedUser => console.log('更新后的用户:', updatedUser))
    .catch(err => console.error('更新失败:', err));

// 删除用户
Model.findByIdAndDelete('userId')
    .then(() => console.log('用户删除成功'))
    .catch(err => console.error('删除失败:', err));

// 查询用户
Model.findById('userId')
    .then(user => console.log('查询到的用户:', user))
    .catch(err => console.error('查询失败:', err));

// 查询多个用户
Model.find({ name: 'Alice' })
    .then(users => console.log('查询到的用户列表:', users))
    .catch(err => console.error('查询失败:', err));
  • 链式调用
javascript
Model.find()
    .where('name').equals('Alice') // 查询条件
    .select('name') // 查询字段
    .sort({ createTime: -1 }) // 按创建时间降序排序
    .limit(10) // 限制返回数量
    .skip(5) // 跳过前 5 条
    .exec() // 执行查询
    .then(results => console.log('查询结果:', results))
    .catch(err => console.error('查询失败:', err));

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命