开始之前先确保你的电脑已经装了mongoDB,且掌握了基本语法,如果没有请移至:
教程:http://www.runoob.com/mongodb/mongodb-tutorial.html
在学习 mongodb 的过程中需要熟悉几个名词以及他们对应的关系型数据库名词。
关系型数据库 | mongodb |
---|---|
table | collection |
row | document |
column | index |
table joins | populate |
primary key | _id |
下面就是连接数据库,这里先看下我的项目结构
安装依赖
npm i egg-mongoose --save //https://www.npmjs.com/package/egg-mongoose
引入插件 app/config/plugin.js
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
};
我们项目中还有使用mysql数据库,ORM用的sequelize,引用了egg-mongoose发现和sequelize冲突,无奈只能先关闭了sequelize。我个人觉得是this.ctx.model只能被使用一次,有两个插件都用了就报错。如果大大们有新的发现或者好的解决方法请评论指导下!小弟这里先谢谢了???~
配置插件 app/config/config.default.js
//config中配置mongose连接mongodb数据库
//Mongodb://eggadmin:123456@localhost:27017 //有用户名密码的情况
exports.mongoose = {
client: {
url: 'mongodb://192.168.0.233/wgtest', //你的数据库地址,不要端口
options: {
useNewUrlParser: true,
},
}
};
例子
app/model/Projects.js
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const OrderSchema = new Schema({
name: {
type: String
},
});
return mongoose.model('Projects', OrderSchema, 'projects'); //返回model,其中projects为数据库中表的名称
}
这里有个暂时没搞懂的问题,如果mongoose.model第一参数是Projects,而你的文件是test.js,在service调用的话得遵循你的文件名,且要大写(this.ctx.model.Projects.find({})),所以建议两者的名字保持统一。
名词解释
Schema、Model、Entity 的关系请牢记,Schema 生成 Model,Model 创造 Entity,Model 和 Entity 都可对数据库操作造成影响,但 Model 比 Entity 更具操作性。
Schema
: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力Model
: 由Schema发布生成的模型,具有抽象属性和数据库操作能力Entity
: 由Model创建的实例,也能操作数据库
Schema.Type
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- Objectid
- Array
app/service/projects.js
'use strict';
const Service = require('egg').Service;
class projects extends Service {
/**
* 根据ID获取单个项目
*/
async getProjectById(id) {
const ctx = this.ctx;
try {
var results = await this.ctx.model.Projects.find({
_id: this.app.mongoose.Types.ObjectId(id)
})
return results;
} catch (err) {
ctx.body = JSON.stringify(err);
}
}
}
module.exports = projects;
this.app.mongoose.Types.ObjectId(id) // 因为mongoDB默认的id是ObjectId类型,所以要转一下,使用mongoose自带的就好
app/controller/projects.js
controller就不写了哈,大家的都差不多,调用service就成
参考文献:
https://blog.csdn.net/zdhsoft/article/details/79890131
https://www.jianshu.com/p/08a602b5b0f1
https://blog.csdn.net/juzipidemimi/article/details/80683121