[toc]
1 NoSQL简介
- NoSQL,全名为Not Only SQL,指的是非关系型数据库;
- 随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来;
1.1 优点缺点
-
优点:
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据库
- 没有复杂的关系
-
缺点:
- 没有标准化
- 有限的查询功能
- 最终一致是不直观的程序,看起来不直观
1.2 分类
类型 | 部分代表 | 特点 |
---|---|---|
列存储 | Hbase Cassandra Hypertable |
顾名思义,是按列存储数据的;最大的特点是方便存储结构化和半结构化数据,方便数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。 |
文档存储 | MongoDB CouchDB |
文档存储一般用类似json的格式存储,存储内容是文档型的;这样也就有机会对某些字段简历索引,实现关系数据库的某些功能。 |
key-value存储 | Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis |
可以通过key快速查询到其value,一般来说,存储不管value的格式,照单全收。<vr>(Redis包含了其他功能) |
图存储 | Neo4J FlockDB |
图形关系的最佳存储。 使用传统的图形关系数据库来解决图形存储的话,性能低下而且设计使用不方便。 |
对象存储 | db4o Versant |
通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
xml数据库 | Berkekey DB XML BaseX |
搞笑的存储XML书记,并支持XML的内部查询语法,比如XQuery、Xpath。 |
2 MongoDB 部署
2.1 名词解释
SQL术语 | MongoDB术语 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table join | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
-
三元素:数据库、集合、文档
- 集合就是关系数据库的表
- 文档对应着关系数据库中的行
-
数据库:是一个集合的物理容器,一个数据库中可以包含多个集合;一个服务器通常有多个数据库
-
集合:类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中;
-
文档:就是一个对象,由键值对构成,是Json的扩展Bson形式:{'name':'lance', 'gender':'Boy'}
2.2 安装MongoDB
tar -zxvf mongodb-linux-x86_64-3.6.5.tgz
mv mongodb-linux-x86_64-3.6.5 /usr/local/
cd /usr/local/
ln -s mongodb-linux-x86_64-3.6.5 mongodb
2.3 配置MongoDB环境变量
vim /etc/profile
MONGO_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGO_HOME/bin
source /etc/profile
2.4 创建数据目录
mkdir -p /mydata/mongodata
确保运行MongoDB的账户,对MongoDB的数据目录有读写权限
2.5 启动MongoDB
mongod --bind_ip_all --logpath /mydata/mongodata/mongod.log --fork --dbpath /mydata/mongodata/
选项:
--bind_ip_all 允许所有 ip 访问,默认是127.0.0.1
--logpath 将 stdout 的内容输出到日志文件
--fork 后台运行 MongoDB
--dbpath MongoDB 的数据布姆
2.6 关闭MongoDB
mongod --shutdown --dbpath /mydata/mongodata/
2.7 连接MongoDB
mongo 命令即可直接连接到本地的MongoDB
3 Mongo操作
3.1 基本命令
命令 | 作用 |
---|---|
db | 查看当前数据库名称 |
db.stats() | 查看当前数据库信息 |
3.2 数据类型
数据类型 | 解释 |
---|---|
Object ID | 文档ID |
String | 字符串,最常用,必须是有效的UTF-8 |
Boolean | 存储一个布尔值,true或false |
Integer | 整数可以是32位或64位,这取决于服务器 |
Double | 存储浮点值 |
Arrays | 数组或列表,多个值存储到一个键 |
Object | 用于嵌入式的文档,即一个值为一个文档 |
Null | 存储Null值 |
Timestamp | 时间戳 |
Date | 存储当前日期或时间的UNIX时间格式 |
3.2.1 object id
- 每个文档都有一个属性,为_id,保证每个文档的唯一性;;
- 可以自己去设置_id插入文档;;
- 如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID;
- objectID是一个12字节的十六进制数:
- 前4个字节为当前时间戳;
- 接下来3个字节的机器ID;
- 接下来的2个字节中MongoDB的服务进程id;
- 最后3个字节是简单的增量值;
3.3 数据库操作
- db
- 查看当前数据库名称
- show dbs
- show databases
- 查看所有数据库名称;
- 列出所有在物理上存在的数据库;
- use 数据库名称
- 切换数据库;
- 如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建;
- 默认的数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中;
- db.dropDatabase()
- 删除当前指向的数据库;
- 如果数据库不存在,则什么也不做;
3.4 集合操作
- db.createCollection(name, options)
- name是要创建的集合的名称;
- options是一个选项,用于指定集合的配置;选项参数是可选的,所以只需要到指定的集合名称。
- 参数capped:默认值为false表示不设置上限,值为true表示设置上限
- 参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
例子:
db.createCollection("sub", { capped : true, size : 10 } )
- show collections
- 查看当前数据库的集合
- db.集合名称.drop()
- 删除集合
3.5 文档操作
3.5.1 插入
- db.集合名称.insert(document)
- 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId;
3.5.2 更新
- db.集合名称.update(<query>, <update>, {multi: <boolean>})
- 参数query:查询条件,类似sql语句update中where部分;
- 参数update:更新操作符,类似sql语句update中set部分;
- 指定属性更新,通过操作符$set
- 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
例子:
db.stu.update({name:'hr'},{name:'mnc'})<br>
db.stu.update({},{$set:{gender:0}},{multi:true})
3.5.3 保存
- db.集合名称.save(document)
- 如果文档的_id已经存在则修改,如果文档的_id不存在则添加;
例子:
db.stu.save({_id:'20160102','name':'yk',gender:1})
3.5.4 删除
- db.集合名称.remove(<query>, {justOne: <boolean>})
- 参数query:可选,删除的文档的条件;
- 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条;
3.5.5 查询
- db.集合名称.find({条件文档})
- 查询,返回全部;
- db.集合名称.findOne({条件文档})
- 查询,只返回第一个;
- db.集合名称.find({条件文档}).pretty()
- 方法pretty():将结果格式化
查询的条件
- 比较运算符:
- 等于:默认是等于判断,没有运算符;
- 小于:$lt
- 小于或等于:$lt
- 大于:$gt
- 大于或等于:$gte
- 不等于:$ne
例子:
查询年龄大于或等于18的学生
db.stu.find({age:{$gte:18}})
- 逻辑运算符:
- 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接;
- 逻辑与:默认是逻辑与的关系;
- 逻辑或:$or;
- and和or一起使用;
例子:
查询年龄大于18或性别为0的学生,并且学生的姓名为gj
db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})
- 范围运算符
- 在范围内,$in;
- 不在范围内,$nin;
例子:
查询年龄为18、28的学生
db.stu.find({age:{$in:[18,28]}})
- 正则表达式
- /正则表达式/
- $regex:'正则表达式'
例子:
查询姓黄的学生
db.stu.find({name:/^黄/})
db.stu.find({name:{$regex:'^黄'}}})
- 自定义函数查询
- 使用$where后面写一个函数,返回满足条件的数据;
例子:
查询年龄大于30的学生
db.stu.find({$where:function(){return this.age>20}})
高级条件
1 limit 和 skip
- limit()
- 用于读取指定数量的文档;
- db.集合名称.find().limit(NUMBER)
- 参数NUMBER表示要获取文档的条数;
- 如果没有指定参数则显示集合中的所有文档;
- skip()
- 用于跳过指定数量的文档
- db.集合名称.find().skip(NUMBER)
- 参数NUMBER表示跳过的记录条数,默认值为0;
- 方法limit()和skip()可以一起使用,不分先后顺序;
- 查询第5至8条数据:
- db.stu.find().limit(4).skip(5)
- db.stu.find().skip(5).limit(4)
- 查询第5至8条数据:
2 投影
- 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段;
- db.集合名称.find({},{字段名称:1,...})
- 参数为字段与值,值为1表示显示,值为0不显示
- db.集合名称.find({},{字段名称:1,...})
例子:
db.stu.find({},{name:1,gender:1})
db.stu.find({},{_id:0,name:1,gender:1})
3 排序
- 方法sort(),用于对结果集进行排序;
- db.集合名称.find().sort({字段:1,...})
- 参数1为升序排列,参数-1为降序排列;
- db.集合名称.find().sort({字段:1,...})
例子:
根据性别降序,再根据年龄升序
db.stu.find().sort({gender:-1,age:1})
4 统计个数
- 方法count(),统计数据个数
- db.集合名称.find.count({条件})
5 消除重复
- 方法distinct(),对数据进行去重
- db.集合名称.distinct('去重字段',{条件})
例子:
查找年龄大于18的性别(去重)
db.stu.distinct('gender',{age:{$gt:18}})
网友评论