[toc]
## 所处层级
数据库>集合>文档模型
## 为什么叫文档而不是直接叫表?
首先有一个错误,`文档模型`这个概念应该与MySQL中的表里的一条记录 相对应,而不是整个表。
So,文档是一条记录,而之所以不直接叫记录,而叫文档,是因为mongoDB里的文档就是一个`JSON对象`,它是可以有灰常多层级的,而可能**不仅仅**是**一条**记录这么简单
正常的所谓一条记录一般是指一条记录对应多个字段,而文档这种记录,可以不仅一个文档包含多个字段,还能在每个字段里又包含多个字段...
```
const ArticleSchema = new Schema({
title: { type: String, required: true },//标题
content: { type: String, required: true },//正文
user: { type: ObjectId, ref: 'User' },//用户作者
pv: { type: Number, default: 0 },//page view 页面的访问量
comments: [//评论
{ user: { type: ObjectId, ref: 'User' }, content: String, createAt: { type: Date, default: Date.now } }
],
createAt: { type: Date, default: Date.now }//创建时间,默认为当前时间
});
```
上面的例子描述了一个叫做`Article`文档集合的骨架,我们可以发现文档集合中的一个文档可以有很多字段,**且**每个字段内部也可能存在很多"字段"
关于`Schema`骨架,需要注意以下几点
- 如果对象中的字段在Schema中没有定义,则会被忽略掉
- 如果说对象中的字段少于Schema中定义的字段, 且少的那部分字段不是必须的,那么缺少的字段不会被保存(缺省,保存的JSON中不会存在这些个字段)
- 如果提供的字段类型和Schema中定义的不匹配,则会报错