MongoDB 教程
MongoDB 教程
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案,以此来解决应用程序开发社区中的大量现实问题。
2007 年 10 月,MongoDB 由 10gen 团队所发展。2009 年 2 月首度推出。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
部署
MongoDB 社区版是免费的并可获得为 Windows、Linux 和 OS X 二进制版本。许多 Linux 包管理系统曾经包含 MongoDB 的包,由于许可证变更,MongoDB 已经从 Debian、Fedora 和 Red Hat Enterprise Linux 发行中移除。
MongoDB 使用内存映射文件,支持 32 位和 64 位应用,32 位系统上限制大小为 2GB 的数据,64 位支持更大的数据。
默认端口为 27017。推荐运行在 64 位平台;
MongoDB 的核心构件只能在小端序系统上运行,客户端库可以在小端序和大端序的系统上运行
MongoDB 已经在多个站点部署,其主要场景如下:
- 1)网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
- 2)缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。
- 3)高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对 MapReduce 引擎的内置支持。
不适用的场景如下:
- 1)要求高度事务性的系统。
- 2)传统的商业智能应用。
- 3)复杂的跨文档(表)级联查询。
语言支持
MongoDB 有官方的驱动如下: C,C++,C# / .NET,Erlang, Haskell,Java,JavaScript,Lisp,fibjs,node.JS, Perl,PHP,Python,Ruby,Scala,Go。
当前还有许多非官方式的驱动,ColdFusion, Delphi, Erlang, Factor, Fantom, Go, JVM languages (Clojure, Groovy, Scala, etc.), Lua, HTTP REST, Racket, 和 Smalltalk.
特点编辑
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性。
- 支持 Golang,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- 文件存储格式为 BSON(一种 JSON 的扩展)。
- 可通过网络访问。
基本概念
(1)文档
文档是 MongoDB 中数据的基本单位,类似于关系数据库中的行(但是比行复杂)。多个键及其关联的值有序地放在一起就构成了文档。不同的编程语言对文档的表示方法不同,在 JavaScript 中文档表示为:
{“greeting”:“hello,world”}
这个文档只有一个键“greeting”,对应的值为“hello,world”。多数情况下,文档比这个更复杂,它包含多个键 / 值对。例如:
{“greeting”:“hello,world”,“foo”: 3}
文档中的键 / 值对是有序的,下面的文档与上面的文档是完全不同的两个文档。
{“foo”: 3 ,“greeting”:“hello,world”}
文档中的值不仅可以是双引号中的字符串,也可以是其他的数据类型,例如,整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。
(2)集合
集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中,例如,对于网站的日志记录,可以根据日志的级别进行存储,Info 级别日志存放在 Info 集合中,Debug 级别日志存放在 Debug 集合中,这样既方便了管理,也提供了查询性能。但是需要注意的是,这种对文档进行划分来分别存储并不是 MongoDB 的强制要求,用户可以灵活选择。 可以使用“.”按照命名空间将集合划分为子集合。例如,对于一个博客系统,可能包括 blog.user 和 blog.article 两个子集合,这样划分只是让组织结构更好一些,blog 集合和 blog.user、blog.article 没有任何关系。虽然子集合没有任何特殊的地方,但是使用子集合组织数据结构清晰,这也是 MongoDB 推荐的方法。
(3)数据库
MongoDB 中多个文档组成集合,多个集合组成数据库。一个 MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。MongoDB 中存在以下系统数据库。
- Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到 admin 数据库中,那么该用户就自动继承了所有数据库的权限。
- Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
- Config 数据库:当 MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。
数据模型
一个 MongoDB 实例可以包含一组数据库,一个 DataBase 可以包含一组 Collection(集合),一个集合可以包含一组 Document(文档)。一个 Document 包含一组 field(字段),每一个字段都是一个 key/value pair。
key: 必须为字符串类型。
value:可以包含如下类型。
- 基本类型,例如,string,int,float,timestamp,binary 等类型。
- 一个 document。
- 数组类型。
参考地址
MongoDB 官网地址:https://www.mongodb.com/
MongoDB 官方英文文档:https://docs.mongodb.com/manual/
MongoDB 各平台下载地址:https://www.mongodb.com/download-center#community