MongoDB简介
程序员文章站
2022-03-14 18:40:09
...
Note:跟MongoDB的Roger发了email,随后给我开帐号了就可以编辑官方wiki了,那边文档格式会好一些。先发份MongoDB简介在这。
“MongoDB不是在实验室设计出来的。利用我们自己开发大型,高可用性和健壮性系统的经验,我们开发了MongoDB。我们并不是从零开始,而是尝试发现哪些地方有问题,然后解决它。所以在我眼中,MongoDB让你从使用MySQL的基于关系的数据模型转变为基于文档的模型,从而获得如快速的嵌入式文档,易管理,使用无结构数据库进行敏捷开发,易于横向扩展和伸缩(因为join不再重要)等大量特性。使用关系型数据时有很多东西工作的很好,比如索引,动态查询和动态更新等,这些在MongoDB中也没怎么变化。比如,在MongoDB里设计索引应该和你在MySQL或Oracle里一样,你有选择在一个内嵌的域上建索引的能力。”
– Eliot Horowitz, 10gen公司首席技术官和联合创始人
为什么选择MongoDB?
面向文档
高性能
高可用性
易伸缩
富查询语言
Mongo大型部署
1. 一个或多个分片,其中每个分片持有部分数据(自动管理)。读写操作自动路由到合适的分片上。每个分片是一个replica set。
一个replica set是一台或多台服务器,每台机器持有相同数据的拷贝。在特定的时间点,一台机器是主节点而其他机器是从节点。如果主节点死掉了,其中一台从节点自动接管为主节点。所有的写操作和一致性读操作都进入主节点,而所有的最终一致性读操作分布到所有从节点上。
2. 多台配置服务器,其中每台配置服务器持有表明数据位于哪个分片的元数据的拷贝。
3. 一个或多个路由器,其中每个路由器都作为一个或多个客户端的服务器。客户端向路由器发起查询和更新,路由器询问配置服务器后将请求分发到合适的分片上。
4. 一个或多个客户端,其中每个客户端都是用户应用程序的一部分,它使用自身语言的mongo客户端驱动向路由器发起请求
mongod是服务器端程序(数据或配置),mongos是路由器程序
小型部署(无分区)
1. 一个replica set(自动故障转移),或者一台主服务器加上零台或多台从服务器(无自动故障转移)
2. 一个或多个客户端,向replica set整体(驱动会管理向replica set中的哪台服务器发起请求)或者单独的主节点发起请求
Mongo数据模型
Mongo查询语言
你需要通过提供一个包含和你想要的文档匹配的域的查询文档来从一个db collection里获得文档。比如,{name: {first: 'John', last: 'Doe'}}会和collection里所有的文档使用John Doe这个姓名来进行匹配。类似的,{name.last: 'Doe'}会使用Doe这个姓来和所有文档进行匹配。而{name.last: /^D/}则会匹配姓以‘D’开头(正则表达式匹配)的所有文档。
查询也可以和嵌入式数组进行匹配。比如,{keywords: 'storage'}会匹配keywords数组中包含‘storage’的文档。类似的,{keywords: {$in: ['storage', 'DBMS']}}会匹配keywords数组中包含‘storage’或‘DBMS’的文档。
如果collection中有大量文档,则你需要建索引来加快查询速度。比如,ensureIndex({name.last: 1})或者ensureIndex({keywords: 1})。注意,索引会占用空间并让更新操作稍微变慢,所以在值得做出折衷的时候再使用它。
“MongoDB不是在实验室设计出来的。利用我们自己开发大型,高可用性和健壮性系统的经验,我们开发了MongoDB。我们并不是从零开始,而是尝试发现哪些地方有问题,然后解决它。所以在我眼中,MongoDB让你从使用MySQL的基于关系的数据模型转变为基于文档的模型,从而获得如快速的嵌入式文档,易管理,使用无结构数据库进行敏捷开发,易于横向扩展和伸缩(因为join不再重要)等大量特性。使用关系型数据时有很多东西工作的很好,比如索引,动态查询和动态更新等,这些在MongoDB中也没怎么变化。比如,在MongoDB里设计索引应该和你在MySQL或Oracle里一样,你有选择在一个内嵌的域上建索引的能力。”
– Eliot Horowitz, 10gen公司首席技术官和联合创始人
为什么选择MongoDB?
面向文档
- 文档(对象)和编程语言的数据类型很好的对应
- 嵌入式文档和数组减少了join的必要
- 动态类型(无结构)使结构演变非常容易
- 没有join和(多对象)事务从而获得高性能和易伸缩性
高性能
- 没有join和事务使得读写操作很快
- 可以索引嵌入式文档和数组
- 可选的异步写操作
高可用性
- 复制服务器自动和主节点故障转移
易伸缩
- 最终一致性读操作分布到复制服务器上
- 自动分片(数据跨服务器自动分区) 读写操作分布在不同的分片上
没有join和事物使得分布式查询简单而高效
富查询语言
Mongo大型部署
1. 一个或多个分片,其中每个分片持有部分数据(自动管理)。读写操作自动路由到合适的分片上。每个分片是一个replica set。
一个replica set是一台或多台服务器,每台机器持有相同数据的拷贝。在特定的时间点,一台机器是主节点而其他机器是从节点。如果主节点死掉了,其中一台从节点自动接管为主节点。所有的写操作和一致性读操作都进入主节点,而所有的最终一致性读操作分布到所有从节点上。
2. 多台配置服务器,其中每台配置服务器持有表明数据位于哪个分片的元数据的拷贝。
3. 一个或多个路由器,其中每个路由器都作为一个或多个客户端的服务器。客户端向路由器发起查询和更新,路由器询问配置服务器后将请求分发到合适的分片上。
4. 一个或多个客户端,其中每个客户端都是用户应用程序的一部分,它使用自身语言的mongo客户端驱动向路由器发起请求
mongod是服务器端程序(数据或配置),mongos是路由器程序
小型部署(无分区)
1. 一个replica set(自动故障转移),或者一台主服务器加上零台或多台从服务器(无自动故障转移)
2. 一个或多个客户端,向replica set整体(驱动会管理向replica set中的哪台服务器发起请求)或者单独的主节点发起请求
Mongo数据模型
- 一个Mongo系统(参考上述部署)包含一组数据库
- 一个database包含一组collection
- 一个collection包含一组document
- 一个Document是一组field
- 一个field是一对key-value
- 一个key是一个名字(字符串)
- 一个value可以是一个 基本类型,如字符串,整数,浮点数,时间戳,二进制等等
document
value的数组
Mongo查询语言
你需要通过提供一个包含和你想要的文档匹配的域的查询文档来从一个db collection里获得文档。比如,{name: {first: 'John', last: 'Doe'}}会和collection里所有的文档使用John Doe这个姓名来进行匹配。类似的,{name.last: 'Doe'}会使用Doe这个姓来和所有文档进行匹配。而{name.last: /^D/}则会匹配姓以‘D’开头(正则表达式匹配)的所有文档。
查询也可以和嵌入式数组进行匹配。比如,{keywords: 'storage'}会匹配keywords数组中包含‘storage’的文档。类似的,{keywords: {$in: ['storage', 'DBMS']}}会匹配keywords数组中包含‘storage’或‘DBMS’的文档。
如果collection中有大量文档,则你需要建索引来加快查询速度。比如,ensureIndex({name.last: 1})或者ensureIndex({keywords: 1})。注意,索引会占用空间并让更新操作稍微变慢,所以在值得做出折衷的时候再使用它。