下载地址 https://www.mongodb.com/download-center
MongoDB是CS架构的,使用前需启动服务端。
mongod run
直接启动mongod --dbpath=DBPATH
指定特定数据存储目录启动,若目录不存在则创建。mongod --logpath=LOGFILE
指定特定日志文件mongod --dbport=DBPORT
指定特定端口启动,默认27017.Wins中默认数据存放目录 C:\data\db
Linux中默认数据存储目录 /data/db
启动服务端时指定存储目录并启动
mongod --dbpath=D:\data\db --logpath=D:\data\log\mongodb.log --dbport=27017 --install
# 创建mongodb日志文件
> touch /var/logs/mongodb.log
# mongodb随机启动
> vi /etc/rc.local
mongod --dbpath=/var/data/db --dblog=/var/logs/mongodb.log --dbport=27017
# 客户端连接
> mongo
浏览器输入 http://127.0.0.1:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.
MongoDB数据库会为每个连接创建一个队列,存放该连接的请求。当客户端发送一个请求会被放到队列末尾。只有队列中的请求都执行完毕,后续的请求才会执行。所以从单个连接就可以了解整个数据库,并且它总是能读到自己写的东西。
每个队列都有独立的,打开两个shell就有两个数据库连接。在一个shell中执行插入之后在另一个查询,不一定能得到插入的文档。然而,在同一个shell中,插入后再进行查询是一定能查询到的。在繁忙的服务器上,交错的插入或查询显得稀松平常。当开发者用一个线程插入数据,用另一个线程检查是否成功插入时,会经常遇到这种问题。有那么一两秒时间好像根本就没插入数据,但随后数据又突然冒出来。
使用Ruby、Python、Java驱动程序时,要特别注意这种行为,因为语言的驱动都使用了连接池。为提高效率,驱动程序和服务器建立了多个连接(连接池),并将请求分散到这些连接中,好在它们都提供了一些机制来确保一系列的请求都由一个连接来处理。
一个运行着的MongoDB数据库可看成是一个MongoDB Server,该Server由实例和数据库组成。数据库是由一系列与磁盘相关的物理文件。
数据逻辑结构
MongoDB 数据逻辑层次结构 - 由 database
组成,database
由 collections
组成,collections
由documents
组成,而 documents
由 fields
组成。
数据存储结构
MongoDB默认数据目录为 /data/db
,它负责存储所有MongoDB的数据文件。
预分配空间
MongoDB内部有预分配空间的机制,每个预分配的文件都用0填充,使MongoDB始终保持额外的空间和空余的数据文件,从而有效地避免了由于数据暴增而带来的磁盘压力过大的问题。
由于表中数据量增加,数据文件每次分配一次,其大小都会是上一个数据文件大小的2倍 ,每个数据文件最大2G。预分配机制有利于防止较小的数据库浪费过多的磁盘空间,同时又保证较大的数据库又响应的预留空间使用。
表命名空间
数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间,这些命名空间的元数据都集中在 *.ns
文件中。
每种编程语言表示文档的方式不同,多个键及其关联的值有序地对应组织是文档,例如映射、散列、字典等,在JS中对象即文档。
集合即一组文档,集合是无模式的,意味着集合中的文档可以是各样的。那么为什么要使用多个集合呢?
多个集合组成数据库,一个数据库实例可承载多个数据库,数据库之间可视为完全独立。
每个数据库都有独立的权限控制,即便在磁盘上不同数据库也放置在不同的文件中,数据库最终变成文件系统里的文件。
MongoDB自带JS shell以便于从命名行与数据库实例交互,shell是一个独立MongoDB客户端。shell中的基础操作CURD:创建、读取、更新、删除。
> post = {title:'ipost', content:'here is blog post', date:new Date()};
> db.blog.insert(post);
> db.blog.find();
> db.blog.findOne();
> post.comments = [];
> db.blog.update({title:'ipost'}, post);
> db.blog.find();
> db.blog.remove({title:'ipost'});
NoSQL(Not Only SQL)非关系型数据库,其特点是非关系型、分布式、开源、水平扩展。NoSQL使用最多的当属key-value存储,当前还有文档型、列存储、图形数据库、XML数据库等。
Memcached和Redis是key-value型数据库,即通过key指向value并通过hash算法关联以达到高效的查询效率。MongoDB是文档数据库,存储的是BSON(JSON的二进制化)。其内部执行引擎为JS解释器,将文档存储为BSON结构,转换为JS对象。
MongoDB与传统型数据库相比较,传统型数据库存储的是结构化数据,定义好表结构后每行数据必须符合列的个数和类型。
MongoDB没有模式,文档的键不会事先定义也不会固定不变,由于没有模式需要更改,通常无需迁移大量数据。不必将所有数据都放到一个模子中,应用层可处理新增或丢失的键,开发者可非常容易地变更数据库模型。
http://www.mongodb.org
工具集
启动服务端
mongos --help
mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017
参数
--dbpath 数据库存放目录,每个数据库会在其中创建一个子目录,用于防止同一个实例多次运行,mongod.lock 也保存在次目录下。
--logpath 数据库日志存放目录,错误日志文件
--port 服务端口默认27017
--fork 以后台进程即Daemon方式启动
--logappend 错误日志采用追加模式,默认为覆写模式。
--bind_ip 对外服务的绑定IP
# 查看磁盘空间
df -h
# 启动数据库
mongod --dbpath /home/mongo/database --dblog /home/mongo/db.log --fork=27017 --port 27017
# 查看服务进程
ps -aux|grep mongo
配置文件方式启动
# 读取启动配置文件的方式来启动数据库
cat /etc/mongodb.conf
dbpath = /data/db
# 写入配置
mongod -f /etc/mongodb.conf
关闭数据库
直接通过在admin库中发送db.shutdownServer()来停止MongoDB实例。
db.shutdownServer()
也可杀死数据库实例的进程
ps aux | grep mongod
# 不用使用 kill -9 PID来杀死MongoDB会导致MongoDB的数据损坏。
kill -2 PID