Mongoose是什么?
Mongoose是MongoDB的一个对象模型工具,封装了许多MongoDB对文档的的增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单。
在egg项目中如何使用?
1、安装
npm i egg-mongoose --save
2、配置
在根目录下的/config/plugin.js中配置插件
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
};
3、连接数据库
在根目录下的/config/config.default.js增加配置,其中url为我们的数据库地址,可通过环境变量来区分开发环境还是生产环境,并且确定是否使用用户名密码的数据库
const prod = process.env.npm_config_server_prod;
mongoose: {
client: {
url: prod ? 'mongodb:eggadmin:123456@localhost:27017/DbName' : 'mongodb://127.0.0.1:27017/DbName',
options: {
useUnifiedTopology: true,
},
},
},
4、配置与使用
(1)数据表配置
在app目录下新建model文件夹,在model文件夹下新建JS文件作为数据表的配置内容,下面以书籍表的配置为例
'use strict';
/**
* @description: Mongoose book Schema,
*/
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const BookSchema = new Schema({
desc: { type: String }, /* 书籍描述 */
name: { type: String }, /* 书籍名称 */
press: { type: String }, /* 出版社 */
author: { type: String }, /* 作者 */
image: { type: Array }, /* 书籍图片列表*/
price: { type: String }, /* 价格 */
book_type: { /* 书籍分类id */
type: Schema.Types.ObjectId,
ref: 'BookClassify',
},
user: { /* 书籍发布者id */
type: Schema.Types.ObjectId,
ref: 'User',
},
create_time: { type: String }, /* 创建时间 */
status: { type: String }, /* 状态,1:待购买,2:已购买*/
look: { type: Number } /* 浏览数量 */
});
return mongoose.model('Book', BookSchema);
};
可以看到我们可以通过Schema来定义表结构,可以指定字段的类型及关联,设置完字段后就可以生成model了,这里算是非常简单的配置,更多配置方法可参考文档
(2)、使用mongoose方法
配置完数据表结构后,我们就可以再service层中调用mongoose的方法对文档进行增删查改了,已书籍列表的处理逻辑为例子
async findbookList(data) {
const { type, page, pageSize, desc, status, userId } = data;
const searchVal = {}
if (type) {
searchVal.book_type = mongoose.Types.ObjectId(type)
}
if (status) {
searchVal.status = status
}
if (userId) {
searchVal.user = mongoose.Types.ObjectId(userId)
}
const search_term = {
$or: [
{ desc: { $regex: desc ? desc : '', $options: '$i' } },
{ name: { $regex: desc ? desc : '', $options: '$i' } },
{ author: { $regex: desc ? desc : '', $options: '$i' } },
{ press: { $regex: desc ? desc : '', $options: '$i' } },
],
};
const totalNum = await this.ctx.model.Book.find(searchVal).and(search_term).countDocuments();
const result = await this.ctx.model.Book.find(searchVal)
.populate({
path: 'user',
select: { name: 1, image: 1 }
})
.populate({
path: 'book_type'
})
.and(search_term)
.sort({ create_time: -1 })
.skip((parseInt(page) - 1) * parseInt(pageSize))
.limit(parseInt(pageSize));
return result ? { bean: {
records: result,
current: page,
size: result.length,
total: totalNum,
}, ...app.config.msg.GET_SUCCESS } : app.config.msg.GET_ERR;
}










