Appearance
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));