[TOC]
### mongoose 复杂模型
#### 仿知乎个人资料建模
* [ ] 分析
![](https://box.kancloud.cn/7ed7f97e48325e7b4df45a7f1dd9dbf5_982x668.png)
~~~
// 引入 mongoose
const mongoose = require('mongoose')
const { Schema, model } = mongoose
// 创建用户Schema
const userSchema = new Schema({
__v: {
type: Number,
select: false
},
// 用户名
username: {
type: String,
required: true
},
// 登录密码
password: {
type: String,
required: true,
select: false
},
// 用户头像
avatar: {
type: String
},
// 用户性别
gender: {
type: String,
required: true,
enum: ['male', 'female', 'secrecy'],
default: 'secrecy',
},
// 个人简介
introduce: {
type: String
},
// 居住地
residence: {
// 字符串数组
type: [{type: String}]
},
//行业
industry: {
type: String
},
// 职业经历
Career:{
type: [{
// 公司名称
corporate: {type: String},
// 职位
job: {type: String}
}]
},
// 教育经历
experience: {
type: [{
// 机构名称
title: {type: String},
// 专业方向
major: {type: String},
// 学历 enum: [1,2,3,4,5] 高中,本科,硕士,博士
Education: { type: Number, enum: [1,2,3,4,5]},
// 入学年份
enrollment_year: { type: Number},
// 毕业年份
graduation_year: {type: Number}
}]
}
})
// 生成用户模型
module.exports = model('User', userSchema)
~~~
*****
* [ ] 建模思路
1. 性别建模
![](https://box.kancloud.cn/cb92cdd30998849ceb69490baebcac06_393x134.png)
```
// 用户性别
gender: {
type: String,
required: true,
enum: ['male', 'female', 'secrecy'],
default: 'secrecy',
}
```
>[danger] type: String 存储为字符串
> enum 可枚举类型,男 or 女 or 保密
> default 默认值为保密
*****
2. 居住地类型建模
![](https://box.kancloud.cn/aae62df21fb0100d9b1824f8f0581849_443x206.png)
```
// 居住地
residence: {
// 字符串数组类型
type: [{type: String}]
}
```
>[danger] 居住地,可以看出,前端传过来的数据是一个数组,里面包含多个
> 所以设计为字符串数组类型
*****
3. 行业选择建模
![](https://box.kancloud.cn/b9b2405c27a636242a56a3c15e58dbc7_395x179.png)
```
//行业
industry: {
type: String
}
```
*****
4. 职业经历建模
![](https://box.kancloud.cn/651e9b15dbcdb6322b9dc1199fe1de20_744x203.png)
```
// 职业经历
Career:{
type: [{
// 公司名称
corporate: {type: String},
// 职位
job: {type: String}
}]
},
```
*****
5. 教育经历建模
![](https://box.kancloud.cn/cfeded8584d783cc075b1a2a3b863ad9_766x151.png)
```
// 教育经历
experience: {
type: [{
// 机构名称
title: {type: String},
// 专业方向
major: {type: String},
// 学历 enum: [1,2,3,4,5] 高中,本科,硕士,博士
Education: { type: Number, enum: [1,2,3,4,5]},
// 入学年份
enrollment_year: { type: Number},
// 毕业年份
graduation_year: {type: Number}
}]
}
```
- 序言
- ES6模块化
- node基础
- FS模块
- 常用变量
- crypto加密
- 基础
- 安装
- 中间件
- 架构
- 结构分层
- 配置
- 路由
- 安装路由
- 自动加载
- 获取参数
- 路由前缀
- 路由中间件
- 控制器
- 请求
- 请求信息
- 数据库
- mongoDB
- mongoDB原生语句
- mongoDB数据库角色
- mongoose连接数据库
- 自动记录时间戳
- 模型
- mongoose模型
- 定义
- 模型初始化
- 查询
- 新增
- 更新
- 删除
- 隐藏字段
- 模式
- 关联查询
- 复杂模型
- 仿知乎个人资料建模
- 关注与粉丝
- 视图
- 模板
- edge
- 日志
- 错误和调试
- 调试当前文件
- nodemon调试
- 异常处理
- Koa2错误处理
- 验证
- Koa验证器
- async-validator
- installation
- 安全
- 数据加密
- 杂项
- jwt
- koa-jwt
- env环境变量配置
- 上传
- 分页和模糊搜索
- 扩展
- nodemon
- bodyparser
- koaJsonError
- cross-env
- uuid生成唯一ID
- pope字符串模板引擎
- 命令行
- 部署
- 附录
- RESTfulApi
- Http动词
- 状态码
- 调用频率限制
- 按需查询字段
- restful分页