MongoDB介绍
mongodb属于nosql数据库,是一个文档型数据库,nosql其实是相对于sql数据库而言的。传统的sql数据库存在一系列的问题。比如:需要遵循ACID范式,数据量过大的时候性能下降,不太容易做扩展等问题。nosql则解决了这样的问题
nosql具有以下特点:
- 简单的数据模型
- 元数据和数据分离
- 弱一致性
- 高吞吐量
- 高水平扩展能力和低端硬件集群
mongodb数据库本身就支持数据切片和分布式,非常易于扩展。而且mongodb的数据建模无需事先定义,适用于非强事务性的数据存储场景。
mongodb常用操作:
安装:
- 通过yum安装
- 通过rpm包安装
- 通过编译安装
- 直接解压二进制文件安装
安装软件类型
- mongod:mongodb服务启动项
- mongo:mongodb的shell接口
- tools:各种数据管理工具
mongodb数据结构介绍
mongodb数据结构有如下几种:
- db:数据库,对应mysql的db
- collection:文档集合,对应于mysql的table
- document:文档,对应于mysql的记录。
mongodb的document是json格式的数据字串。在往mongodb插入数据的时候不需要实现定义数据库范式,不同document的字段个数也不需要一致。
常用命令
help() #获取帮助信息
show dbs #列出当前数据库
show collections #列出指定库中数据表
show users #列出用户
show profile #列出当前数据库所有性能参数
show logs #列出日志
show log() #列出指定日志
db.stats() #列出数据库状态
db.version() #列出数据库版本
db.serverStatus() #列出数据库所在服务器状态信息
db.getcollectionNames() #列出当前库所有collection
db.collection.stats() #列出当前collection的信息
CRUD操作
> use db_name #切换和创建数据库,mongodb不需要手动创建数据库,执行此命令其实已经创建数据库了,但是此时show dbs不会显示,只有往db中插入数据才会显示
> db.students.find() #列出所有document
> db.students.find({age:{$lt: 1}}) #列出age小于1的所有数据
> db.students.find({age:{$lt: 1}}).count() #统计所有age小于1的数据个数
> db.students.find({age:{$lt:9}}).limit(3) #仅显示3条age小于9的数据
> db.students.find({age:{$lt:9}}).skip(3) #显示age小于9的数据,跳过前三条
> db.students.findOne({age:{$lt:9}}) #仅显示一条age小于9的数据
> db.students.find({age:{$in:[10,20]}}) #显示年龄在10到20中间的数据
> db.students.find({$or:[{name:'student15'},{age:10}]}) #查找name为student15或者age为10的用户
> db.students.find({$and:[{name:'student15'},{age:10}]}) #查找name为student15并且age为10的用户
> db.students.find({class:{$exists:true}}) 查询存在class字段的文档
> db.studnets.update({name:"tom"},{$set:{age:21}}}) #修改tom的age为21
find操作支持如下高级用法:
- 比较操作
- $gt:大于
- $gte:大于等于
- $lt:小于
- $lte:小于等于
- $ne:不等于
- $in:在某个取值范围内
- $nin:不在某取值范围内
- 组合条件查询
- $or:或
- $and:与
- $not:非
- $nor:异或,返回不符合指定条件的document
- 元素查询
- $exists:返回存在某字段的数据
- $mod:对指定字段进行取模操作
- $type:返回指定字段类型为指定类型的文档,语法格式{field:{$type:<BSON type}};1 Double(双精度),2 String,3 Object(对象),Array,Binary data,Undefined,Boolean,Date,Null,Regular Expression,JavaScripy,TimeStamp
注意:每一种数据类型都有一种数字来表示此类型
update常用操作:
- $set:重置某字段值,语法格式({field:value},{$set:{field:new_value}})
- $unset:删除某指定字段
- $rename:对某字段重命名,语法格式({field:value},{$unset:{field1,field2,...}})
- $inc:增加一个字段的值,实现自增长
删除常用操作:
db.mycoll.remove(<query>,<justOne>) justOne指定要删除的个数
db.mycoll.remove({age:21}) 删除年龄为21的文档
db.mycoll.drop() 删除当前指定coll
db.dropDatabase() 删除库,需要先切换到库中
mongodb的索引
mongodb支持的索引类型:
- 单字段索引:构建一个字段的索引
- 组合索引:构建多字段的索引
- 多键索引:索引创建于子文档的索引
- 空间索引:基于位置的索引
- 文本索引:搜索整个文档的文本串
- hash索引:只适用于精确查找,hash索引不论数据多少,查询速度都是一致的
注意:按照范围查询使用的是树状索引
索引操作命令
db.students.ensureIndex({name:1}) #在name上创建升序索引,1表示升序索引,一般索引名即为字段名,可以通过name来额外指定索引名
db.students.getIndexes() #获取在students上的所有索引
db.students.dropIndexes() #删除所有索引
db.students.dropIndex(Index_name) #删除指定名字索引
db.reIndex() #重建索引
db.students.find(name:"student5000").explain() #显示语句的执行过程
索引常用操作:
- backgroup:true:表示在后台创建索引
- unique:ture:表示在指定字段创建唯一键索引,不能插入重复值,否则会报错
- dropDups:true:删除原有相同数据
- sparse:true:创建稀疏索引
注意:
稀疏索引:多个字段取值共用一个索引项,比如1到5岁的人指向一个索引。索引体积小,但是可能需要做二次查找
稠密索引:每一个字段取值都有一个单独的索引项
mongodb常用服务器选项
常用服务器选项:
- fork={true|false} mongod是否运行于后台
- bind_ip=IP 启动之后监听地址
- port=PORT 监听端口,默认27017,web端口28017
- maxConns= 最大并发连接数,默认为1000000
- logpath 日志位置,历史事件日志
- syslog 由syslog管理日志
- syslogFacility
- logappend 是否使用日志滚动
- keyFile 集群关系认证的私钥文件位置
- setParameter
- httpinterface 是否启用内置的web监控接口,默认28017
- clusterAuthMode 集群认证
- nounixsocket 是否监听于本地套接字
- unixSocketPrefix 在哪个路径创建套接字
- auth={ture|faluse} 是否在数据库级别启用认证功能
- repair 启动mongodb时先去修复database,进程意外终止导致数据没有同步时使用
- journal 启用日志功能,保证数据一致性的日志,比较类似事务日志,单实例模型下一定要启用
- journalCommitInterval 日志提交时间间隔,数据隔一段时间写入硬盘,把随机IO变成顺序IO
- oplogSize oplog大小,默认为可用磁盘空间5%,最小1G
调试相关选项: - cpu 周期性显示cpu和iowait的利用率信息
- sysinfo 显示系统级别诊断相关信息
- slowms 界定慢查询的时间,单位是毫秒
- profile={0,1,2} 剖析系统问题,0关闭,1慢查询,2剖析所有操作