mongoDB很火很强大,比较适合web2.0,高数据量,高压力,高可用,读写比例高,伸缩性需求强的环境。其缺点很也明显,事务支持弱,实时性弱(web应用完全可以接受),多表操作复杂。mongoDB使用文件存储数据,存储方式采用freelist方式。推荐使用64位机器做mongoDB服务器。
mongoDB中的元素分为:文档(行),集合(表),数据库(数据库)。
启动参数:
- dbpath:数据库文件存放路径。
- logpath:日志文件路径。
- logappend:日志追加模式(默认是覆盖)。
- bind_ip:对外服务绑定ip。
- port:端口,web管理端口+10000。
- fork:daemon方式。
- journal:开启日志功能。
- syncdelay:系统同步刷新磁盘时间,单位秒,默认60。
- directoryperdb:每个db存放在单独目录中,建议设置该参数,与mysql独立表空间类似。
- maxConns:最大连接数。
- repairpath:执行repair时的临时目录。没有开启journal,异常down机后重启,必须执行repair操作。
mongoDB操作,dn=数据库名,mongoDB不需要显示创建库,当执行操作时会自动创建。
基本操作:
- 插入:.save(文档)
- 查询:.find([{条件},{字段:1,...}])。findOne([{条件}])返回游标第一条记录。
- 限制:.limit(数量)。
- 修改:.update({条件},{$set:{key:value}},$inc整型增加。
- 删除:.remove([{条件}])
- 记录条数:.count()。要返回限制之后的记录条数:.count(true|非0)
- 跳跃:.skip(数量从0开始)。配合limit形成mysql中limit操作:.skip(start).limit(size)
- 排序:.sort({key:[1|-1]...})。1升序,-1降序。
- 分组:MapReduce相当于mysql中group by,但是操作更加灵活。
db.runCommand( { mapreduce:<collection>,//表 map:<map function>,//生成K/V形式对象 reduce:<reducefunction>//对生成的K/V形式对象进行相关操作 [,query:<条件>]//相当于where条件 [,sort:<条件>]//排序 [,limit:<数量>]//限制 [,out:<名称>]//统计结果存放集合,不指定则使用临时集合,客户端断开后自动删除 [,keeptemp:<true|false>]//是否保留临时集合 [,finalize:<function>]//最终处理函数 [,scope:<对象>]//向map,reduce,finalize导入外部变量 [,verbose:true]//显示详细的时间统计信息 })
条件操作:
- $or:{$or:[{条件},...]}。或。
- like:{key:/value/}=key like %value%。{key:/^value/}=key like value%。
- $T 比较:{key:{$T:value}}。$gt:大于,$lt:小于,$gte:大于等于,$lte:小于等于,$ne:不等于。
- $all 匹配所有:{key:{$all:[value...]}},key包含所有value...才符合。
- $in 包含:{key:{$in:[value...]}},key包含其中1个value...就符合。
- $nin 不包含:{key:{$nin:[value...]}},key一个都不包含value...才符合。
- $exists 判断字段是否存在:{key:{$exists:[true|false]}}。判断文档是否包含某个字段,在判断null时会联合使用。
- $mod 取模:{key:{$mod:[x,y]}}。判断key取模x等于y。
- distinct:db.dn.distinct('key')。
- 正则匹配:{key:{[|$not]:/正则/}}
- null 值:直接写null,不用加冒号,也不能不写。
常用组件:
- capped collection:LRU集合,常用于日志、缓存、自动存档。读写效率比默认collection高,必须事先创建并声明大小,超过指定大小后,则采用FIFO策略。只能insert,update,不能delete。
- gridfs:海量大文件存储。./mongofiles put filePath 。./mongofiles get filePath
管理:
- 数据导出:./mongoexport -d dn -c tableName -o outPutFile。
- 数据导入:./mongoimport -d dn -c tableName -o inputFile。
- 数据备份:./mongodump -d dn -o dumpPath
- 数据恢复:./mongorestore -d dn dumpPath
- 访问控制:1.绑定访问ip地址:./mongod --bind_ip ip。2.设置端口.3.U/P:服务端启动登录验证模块 ./mongod --auth。添加用户:db.addUser(U,P)
优化:
- 创建索引:.ensureIndex({key:[1|-1]}[,backgroud:true])。1,升序,2降序。backgroud:后台执行,推荐。
- 开启慢查询日志:启动db时加上参数 -profile=级别 -slowms=.0:不开启,1:记录慢查询(不设置slowms则默认为>100ms),2:记录所有命令。
- 查询慢查询日志:db.system.profile.find({millis:{$gt:100}})
- 限定返回结果条数
- 只查询使用到的字段,而不查询所有字段
- 采用capped collection。
- server side code execution,慎用。
- hint:强制使用索引。
性能监控:
- mongosniff:./mongosniff --source NET lo。从底层监控有哪些命令发送给mongoDB去执行。
- mongostat:./mongostat。实时统计。
- db.serverStatus():实时运行状态。
- db.stats():数据库状态。
- cacti、nagios、zabbix等第三方监控。
高可用:
- replica sets:集群。
- 主从:主启动时加 -master,从启动时加-slave -source。新版本不推荐
海量数据处理:replica sets+sharding
。