## 基本概念
Connection 连接
一个连接就是ip+port连接到mongo的一台服务器上。
一个连接可以对应多个数据库,即在一个mongo服务器上面可以创建多个数据库。
Database 库
对应每一个具体的数据库,比方ip + port / test,其中的test就是这个连接指定的其中一个数据库,注意是其中一个,因为一个连接中可以创建多个数据库哈。
Collection 表
对应到数据库中的表,一个数据库可以创建多个表。
Document 文档
此时的document我们不能简单的理解为是一条记录,如果是一条记录的话,那么和mysql就没有区别了,但是我们知道mongo是非关系型数据库,那么他的特点在于非关系型。一会在下面说。
## 对于document的理解?
documet,到底什么是document?
一个document可以理解为是一个json对象,那么下面例子
```json
{
"item": "journal",
"status": "A",
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"instock": [
{
"warehouse": "A",
"qty": 5
}
]
}
```
我们来分析这个对象,第一,首先这个外面包裹着的最大的对象一定是一个document,size对象是一个document,instock是不是document呢?答案是否定的,instock不是document对象他是一个数组。。那么instock数组中的元素是不是对象呢。instock中的每一个元素都是一个document对象。所以,我们总结一下就会发现,每一个document就是一个对象,即json中的value值有花括号表示的。
**所以在本json中有三个document对象。**
## 到底是什么是非关系型数据库?
都说非关系型数据,现在是脍炙人口,给人的感觉有点高深莫测,觉着这个东西好像比关系型数据库为代表的mysql还要厉害。
那么这里面到底什么是非关系型数据?
简言之json就是非关系型数据,一维数据就是非关系型数据库的一条记录。
因为在mysql中如果发生元素嵌套的情况,我们是不好处理和展示的。
但是在非关系型数据库专门对这种数据进行统一处理和保存,典型的代表有mongodb和elasticsearch。
例如
### 非关系型数据
```json
{
"item": "journal",
"status": "A",
"size": {
"h": 14,
"w": 21,
"uom": "cm"
},
"instock": [
{
"warehouse": "A",
"qty": 5
}
]
}
```
### 关系型数据
```json
{
"_index": "logs",
"_type": "applog",
"_id": "M8pS2HoBj0KJyls7LwjQ",
"_score": 0.19361557,
"msg": "开始记录查询信息, address: 阳光城上府-city: 杭州市"
}
```
可以很明显看出来这两种数据格式的差别了。
## mongodb 集群
### replica set
> 参考文章
https://blog.csdn.net/wang1144/article/details/53964999?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.control&spm=1001.2101.3001.4242
1. 什么是Read Preference Modes模式?如何选出是请求写结点,还是读节点?
2. 仲裁者的工作方式?如果Primary挂掉了,如何感知?有什么规则?那么选举Secondary节点为Primary节点又有哪些规则?
3. primary挂掉之后,如果再次恢复是否存在节点抢占的情况?
答:会,如果primary起来了之后,现在的primary节点会变为备份节点,恢复他原本的状态。
primary和secondry状态变更如下
primary:unreachable(由于他挂了);secondry:primary。
primary:secondry(由于他起来了,处于中间状态);secondry:secondry。
primary:primary(起来之后的最终状态);secondry:secondry(状态不变)。
4. 主备节点如何选举?
下面是配置文件
```json
{ _id:"testrs", members:[ {_id:0,host:'10.10.148.130:27017',priority:2}, {_id:1,host:'10.10.148.131:27017',priority:1},
{_id:2,host:'10.10.148.132:27017',arbiterOnly:true}] }
```
`_id:"testrs"` 代表给这个mongo集群分组,起一个组的名字叫做testers组。
`members` 属性代表在这个组下面的成员有哪些,我们可以看到这是一个list数组。并且每个对象的基本格式是`_id`,`host`,`priority`等。分别代表着序号,主机(ip:port),优先级(值越大越优先)。如果是仲裁者成员,里面没有priority属性,因为他不需要参加选举,所以,拥有一个特殊的属性来标记他,就是 arbiterOnly,可以翻译为:仅仲裁,特点是不参与选举和数据存储。
MongoDB,看这一篇就够了