MongoDB 简介
1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易
2. 易于扩展:MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易的再多台服务器之间进行分割。自动处理跨越集群的数据和负载,自动重新分配文档。
以及将用户请求路由到正确的机器上。
3. 丰富的功能:索引,聚合,特殊的集合类型(过期,固定大小的集合),文件存储。
4. 卓越的性能
MongoDB基础知识
1. 文档:文档就是键值对的一个有序集。
1). MongoDB不但区分类型,而且区分大小写。
2). 文档中的键值对是有序的:{"x":1,"y":2}与{"y":2,"x":1}是不同的。
2. 集合:集合就是一组文档
1). 集合是动态模式的。这意味着一个集合里面的文档可以是各式各样的。
2). 集合命名:不能包含"system.",不能有保留字符'$'
3). 子集合:组织集合的一种管理是使用"."分割不同命名空间的子集合。很多MongoDB工具类都使用了子集合。在MongoDB中使用子集合来组织数据非常高效,值得推荐。
3. 数据库:在MongoDB中,多个文档组成集合,而多个集合可以组成数据库。
1). 数据库名区分大小写,即便是在不区分大小写的文件系统中也是如此。简单起见,数据库名应该全部小写。
2). 数据库最终会变成文件系统里的文件,而数据库名就是相对应的文件名。
3). 保留数据库:
admin: 如果将一个用户添加到admin数据库,这个用户将自动获取所有数据库权限。再者,一些特定的服务器命令也只能从admin数据库运行,如列出所有数据库或关闭服务器。
local: 这个数据库永远不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中。
config:MongoDB用于分片设置时,分片信息会存储在config数据库中。
4). 把数据库名添加到集合名前,得到集合的完全限定名,即命名空间。命名空间的长度不得超过121字节,且在实际使用中应小于100字节。
4. shell中的基本操作
1). insert
2). find和findOne
3). update , 至少两个参数,第一个是限定条件(用于匹配待更新的文档),第二个是新的文档
4). remove , 永久删除,如果没有任何参数,它会删除所有文档
5. 数据类型
1). 基本类型:null({"x":null}) , 布尔型 , 数值 ,字符串,日期({"x":new Date()} 日期被存储为自新纪元已经过的毫秒,不存储时区),正则表达式,数组,内嵌文档,对象id,
二进制数据,代码
2). ObjectId是"_id"的默认类型。ObjectId的12字节按照如下方式生成:时间戳 机器 PID 计数器
3). 如果插入文档时没有"_id"键,系统会自动帮你创建一个。可以由MongoDB服务器来做这件事,但通常会在客户端由驱动程序完成。
6. 使用MongoDB shell
1). 在启动shell时指定机器名和端口,就可以连接到一台不同的机器: mongo some-host:30000/myDB // IP:port/dbname
2). 启动mongo shell 时不连接到任何mongod有时很方便。通过--nodb参数启动shell,启动时就不会连接任何数据库:mongo --nodb
启动之后,在需要时运行new Mongo(hostname)命令就可以连接到想要的mongod了: conn = new Mongo("some-host:30000") , 然后执行 db=conn.getDB("myDB")
3). 对应MongoDB 特有的功能,shell内置了帮助文档,可以使用help命令查看:help
4). 可以通过db.help()查看数据库级别的帮助,使用db.foo.help()查看集合级别的帮助
5). 直接在shell中输入函数名(函数名后不要输入小括号),这样就可以看到相应的JS实现代码。
7. 使用shell执行脚本
1). 直接在命令中传递脚本:mongo s1.js s2.js
2). 如需在指定的主机或端口上执行脚本,需指定地址和脚本名称:mongo --quiet server-1:30000/foo s1.js s2.js
3). 使用load函数:load("s1.js")
4). 可以使用脚本将变量注入到shell
8. 创建.mongorc.js 文件
1). 如果某些脚本会被频繁的加载,可以将它们添加到mongorc.js 文件中。这个文件会在 启动shell时 自动运行。
2). .mongorc.js最常见的用途之一是移除那些比较"危险的函数"。可以在这里集中重写这些方法。这种方式并不能保护数据库,只能预防自己手误。
9. 定制shell提示
通常来说,提示函数中应该包含对getLastError的调用。这样可以捕获数据库错误,而且可以在shell断开时自动重连。
10. 编辑复合变量
1). shell不可以编辑之前的行。对于大块的代码或者对象,你可能更愿意在编辑器中编辑。为了方便地调用编辑器,可以在shell中设置EDITOR变量(也可以在环境变量后总设置)。
EDITOR="/usr/bin/emacs"
现在编辑一个变量,可以使用"edit 变量名"这个命令。修改完后,保存并退出编辑器。变量就会被重新解析然后加载会shell。
2). 在.mongorc.js文件中添加一行内容,EDITOR="编辑器路径";,以后就不用单独设置EDITOR变量了。
11. 集合命名注意事项:
1). 可以使用db.collectionName获取一个集合内容,但是如果集合名称中包含保留字或者无效的JS属性名,db.collectionName就不能正常工作了。
2). 访问一些包含保留字或者无效的JS属性名的集合可以使用:db.getCollection("collectionName")
3). 数组访问法
启动和停止MongoDB
1. 启动MongoDB
1). 执行mongod程序可启动MongoDB服务器,mongod在启动时可使用很多可配置的选项,在命令行中运行mongod --help可列出这些选项。
2). mongod 常用配置选项:
--dbpath : 使用此选项可以指定一个目录为数据目录。需要启动前建立好目录。mongod启动时,会在其数据目录中创建一个mongod.lock文件,以阻止其他mongod进程使用该目录。
--port : 指定服务器监听端口。默认27017。
--fork : 启动此选项以调用fork创建子线程,在后台运行MongoDB。启用--fork选项时,必须同时启用--logpath选项。
--logpath:使用此选项,所有输出信息会被发送到指定文件,而非在命令行上输出。文件不存在就新建,如果存在覆盖。如需保留旧日志,需启动时再增加选项--logappend选项。
--directoryperdb:启动该选项可将每个数据库存放在单独的目录中。
--config:额外加载配置文件。该选项通常用于确保每次重新启动时的选项都是一致的。
举例:./mongd --port 5586 --fork --logpath mongodb.log --logappend
3). 首次安装启动MongoDB时,应查看一下日志,看看都会有哪些警告。
4). 使用配置文件,启动命令:./mongod --config mongodb.conf
配置文件内容举例:
# 这里可以写注释 port=5586 fork=true # 后台启动 logpath=/var/log/mognodb.log logappend=true
2. 停止MongoDB
1). 使用shutdown命令--{"shutdown":1}
2). shell提供了一个辅助函数,用以简单执行shutdown命令:db.shutdownServer()
3). 可使用force选项,强制关闭主节点:db.adminCommand({"shutdown":1,"force":true})
4). kill -2 pid 或者 kill pid
5). 在主节点上运行shutdown命令时,服务器在关闭前,会等待备份节点追赶主节点以保持同步。这将回滚的可能性降至最低,但shutdown操作有失败的可能。如果几秒内没有
备份节点成功同步,则shutdown操作失败,主节点亦不会停止运行。可以使用force选项,强制关闭主节点。这相当于发送一个SIGINT或者SIGTERM信号(几种做法都能使
MongoDB安全地停止运行,但可能会有数据未能完成同步)。如服务器正在终端作为前台进程运行,那么按下Ctrl+C快捷键也能发送一个SIGINT信号。另外,kill之类的命令,
也可以用于发送这些信号。假设mongod的PID为10014,那么相应的命令就是kill -2 10014(发送SIGINT信号)或kill10014(发送SIGTERM信号)
6). mongod收到SIGINT或者SIGTERM信号后,会安全地停止运行。这意味着mongod会等当前正在进行的操作或者文件预分配结束(耗时一定时间),再关闭所有打开的连接,将
缓存写入硬盘,继而结束运行。但不会等待备份节点追赶上主节点。
3. 安全性
1). 最好的方式是设置防火墙,只允许内部网络地址对MongoDB的访问。
2). --bind_ip : 指定MongoDB监听的接口。我们通常将其设置为一个内部IP地址,从而保证应用服务器和集群中的其他成员访问,同时拒绝外网访问。
3). --nohttpinterface : 关闭默认启动的微型HTTP服务器
4). --nounixsocket : 禁用UNIX socket 来进行连接。
5). --noscripting : 禁用服务器端JavaScript脚本的运行。可能会引起一些辅助函数失效。
6). 数据加密和SSL安全连接
4. 日志
1). MongoDB会输出大量日志消息,但请不要使用--quiet选项(该选项会隐藏部分日志消息)。保持日志级别为默认值通常不错,此时日志中有足够的信息进行基本调试(如耗时
过长或启动异常的原因等)。调试应用某特定异常问题时,可以使用一些选项从日志中获取更多信息。
2). 在重启MongoDB时,可通过在参数中附加数据更多的"v"(即:-v,-vv,-vvv,-vvvv,-vvvvv) 或者运行setParameter命令,完成日志级别(log level)的更改。
db.adminCommand({"setParameter":1,"logLevel":3})
记得将日志级别重设为0,否则日志中会存在过多不必要内容。日志级别调高到5时,mongod会在日志中记录几乎所有操作,包括每一个请求所处理的内容。如果记录所有
内容,会产生大量的磁盘读写操作(IO),可能会拖慢系统运行。
3). 如需即时看到正在运行的所有操作,打开分析器不失为一个更好的方法。
4). MongoDB默认记录耗时100毫秒的查询,可以通过setProfilingLevel命令来更改次阈值。
5). 设置一个计划任务以便每天或者每周分割日志文件。如果使用--logpath选项启动MongoDB,以进程发送一个SIGUSR1信号即时其对日志进行分割。也可以使用logRotate
命令达到相同目的:db.adminCommond({"logRotate":1})