(一)、什么是NOSQL
1-1-1、NOSQL简介
NOSQL是not only sql 的缩写,它指的是非关系型的数据库,是以key-value形式存储(类似JAVASCRIPT中的基于面向对象的语言形式),和传统的关系型数据库不一样,不一定遵循传统数据的一些基本要求,比如遵循 sql标准、acid属性、表结构等,这类数据库主要特点有:非关系型的、分布式的、开源的、水平可扩展的。
1-1-2、NOSQL发展现状
目前国内外正在应用nosql 的网站有:
新浪微博 Redis
Google Bigtable
淘宝数据平台 Tair
视觉中国网站 MongoDB
优酷运营数据分析 MongoDB
飞信空间 HandlerSocket
豆瓣社区 BeansDB
1-1-3、为什么要使用NOSql数据库
随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求。虽然关系型数据库已经在业界的数据存储方面占据不可动摇的地位,但是由于其天生的几个限制,使其很难满足下面的这几个需求:扩展困难,读写慢,成本高,有限的支撑容量。但是Nosql关注的是对数据高并发的读写和对海量数据的存储等,与关系型数据库相比,它们在架构和数据模型方面做了“减法”,而在扩展和并发等方面做了“加法”。
1-1-4、NoSql数据库的优缺点
在优势方面,主要体现在下面这几点:
简单的扩展
快速的读写
低廉的成本
灵活的数据模型
在不足方面,常见主要有以下几点:
不提供对SQL的支持
支持特性不够丰富
现有的产品不够成熟
(二)、认识MongoDB
1-2-1、MongoDB简介
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似Javascript面向对象的查询语言,它是一个面向集合的,模式自由的文档型数据库。
面向集合(Collection-Orented)
意思是数据被分组存储在数据集中被称为一个集合(Collection)。每一个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表,不同的是它不需要定义任何模式。
模式自由(schema-free)
意思是集合里面没有列和行的概念, 下面两个记录可以存在于同一个集合里面:
{“name”:“mongo”}
{“age”:25}
文档型(documents)
意思是我们存储的数据时键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档,每一个文档相当一关系数据库中的一条记录。
1-2-2、MongoDB的特性
mongoDB的特点是高性能,易部署,易使用,存储数据非常方便,主要特性有:
面向集合存储,易于存储对象类型的数据
模式自由
支持动态查询
支持完全索引,包含内部对象
支持复制和故障恢复
使用高效的二进制数据存储,包括大型对象(如视频等)
自动处理碎片,以支持云计算层次的扩展性
文件存储格式为BSON(一种JSON(JavaScript Object Notation是一种轻量级的数据交换格式,它基于JavaScript的一个子集)的扩展)。
适用的场景:
持久化缓冲层
高效的实时性
用于对象及JSON数据的存储
高伸缩性的场景
大尺寸,低价值的数据存储
不适用的场景:
要求高度事务性的系统
传统的商业智能应用
复杂的多表查询
(三)、Windows下MongoDB操作
1-3-1、下载与解压
官方网站:http://www.mongodb.org/downloads。
下载对应版本,解压到C:\mongodb下(这个任意选择)。
在启动MongoDB之前,我们必须新建一个存放mongoDB数据和日志的目录。数据库目录:C:\mongodb\data\db,日志目录:C:\mongodb\data
1-3-2、运行服务端
打开CMD窗口,进入到C:\mongodb\bin目录下,运行服务端mongod.exe。
C:\>cd C:\mongodb\bin
C:\mongodb\bin>mongod.exe --dbpath=C:\mongodb\data\db --directoryperdb --logpath=C:\mongodb\data\logs --logappend (注意是两个横线- -)
注:
日志文件为C:\mongodb\data\logs,以及添加方式记录(追加)。
数据目录为C:\mongodb\data\db,并且每个数据库将储存在一个单独的目录(--directoryperdb)。
服务端要一直运行。Ctrl+C可中断。切勿直接关闭窗口,否则会产生一个锁文件,使数据损坏,无法再次打开。
1-3-3、运行客户端
再打开一个CMD窗口,进入到C:\mongodb\bin目录下,运行客户端mongo.exe来登录mongodb。(要保持服务端mongod.exe的窗口不关闭),退出时使用exit命令。
(四)、MongoDB的体系结构
1-4-1、数据库的逻辑关系对比:
逻辑关系对比
| Mongodb
| Mysql
| Db(数据库)
| Database(数据库)
| Collection(集合)
| Table(表)
| Document(文档)
| Row(行)
| Field(列)
| Col(字段)
| 1-4-2、数据存储结构对比:
Mysql的数据存储结构:
Mysql的每一个数据库存放在一个与数据库同门的文件夹中,Mysql如果使用MyISAM存储引擎,数据库文件类型就包括.frm、MYD、MYI。
MongoDB的数据存储结构:
MongoDB的默认数据目录是/data/db,它负责存储所有的MongoDB的数据文件。在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。所有如果系统中有一个叫guodb的数据库,那么构成guodb这个数据库的文件就会由guodb.ns,guodb.0,guodb.1等等组成。每个数据文件都会被预分配一个大小,第一个文件名字为“.0”,大小为64MB,第二个文件“.1”为128MB,依此类推,文件大小上限为2GB。
1-4-3、MongoDB数据类型
MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组和对象),不能完成满足复杂业务需要,因此,BSON还提供日期、32位数字、64位数字等类型。一下对MongoDB的数据类型进行简要说明:
1、 null ——用以表示空值或不存在的字段
如:{“one”:null}
2、 布尔类型 ——有两个值‘true’和‘false’
如:{“one”:true}
3、 32为整数 ——MongoDB的控制台使用JS引擎进行输入,二JS仅支持64位浮点数,所以32位整数将会被自动转义
4、 64位整数 ——与32位整数一样,在mongoDB控制台使用时,会被自动转义成64位浮点数。
5、 64位浮点数 ——mongoDB控制台数字的默认类型。
如:{“one”:2.02}、 {“one”:10}
6、 字符串 ——UTF-8字符串都可以表示为字符串类型的数据。
如:{“one”:“hello world”}
7、 符号 ——在MongoDB控制台中不支持这种类型,将自动转换成字符串
8、 ObjectId类型 ——对象id是文档中唯一的12位的ID
0|1|2|3|4|5|6|7|8|9|10|11
时间戳 |机器码 |PID | 计数器
如:ObjectId(“4eae239f63520362e051e7fd”)
9、 日期 ——如:{“one”:new Date()}
10、正则表达式——文档键值可以包含正则表达式,如:{“x”:{“name”:“Tom”,“age”:20}}
11、代码(函数)——如:{“one”:function(){/*… … … */}}
12、数组——文档中的键值可以表示为数组,在数组中还可以嵌套数组
如:{“x”:[“a”,”b”,[“c”,”d”]]}
13、内嵌文档 ——文档可以包含别的文档,也可以作为值嵌入到父文档中
如:{“x”:{“name”:“Tom”,“age”:20}}
(五)、常用简单的数据操作
1-5-1. 新建数据库与数据集合:
MongoDB命令行客户端的脚本语法有些类似MySQL的:
1. 列出所有数据库
> show dbs
2. 切换并产生数据库
>use memo // 使用数据库memo。即使这个数据库不存在也可以执行,但该数据库不会立刻被新建,要等到执行了insert等的操作时,才会建立这个数据库。
3. 列出当前数据库的collections
> show collections
4. 显示当前数据库
> db
5. 列出用户
> show users
1-5-2. 插入数据:(插入数据的方式有很丰富)
(1) 首先定义一个document(包括键和值,可以是多个),然后使用db.集合名.save(document)方法将数据加入到集合中。如:
document ={name:”guo”,addr:”hebei”};
db.g_test.save(document);
db.g_test.find(); //显示集合中的所有数据
(2) 使用db.集合名.insert()方法,方法中直接传递键和值(可多个,使用{}括起来)如:
db.g_test.insert(name:”guo2”,addr:”Beijing ”);
db.g_test.find(); //显示集合中的所有数据
(3) 同(1)先定义一个document,然后使用db.集合名.insert(document) 方法,
1-5-3. MongoDB的查询语法很强大,类似于SQL的条件查询。
例如,很多SQL可以做的,它都可以做:
db.g_test.find() // select * from g_test
db.g_test.find().limit(10) // select * from g_test limit 10 (输出10条记录)
db.g_test.find().sort({x:1}) // select * from g_test order by x asc (按x升序输出)
db.g_test.find().sort({x:1}).skip(5).limit(10) // select * from g_test order by x asc limit 5, 10 (升序从第2个到第3个输出)
db.g_test.find({x:10}) // select * from g_test where x = 10 (输出x=10的记录)
db.g_test.find({x: {$lt:10}}) // select * from g_test where x <= 10 ( )
db.g_test.find({}, {y:true}) // select y from g_test ( )
一些SQL不能做的,MongoDB也可以做:
db.g_test.find({"address.city":"gz"}) // 搜索嵌套文档address中city值为gz的记录
db.g_test.find({likes:"math"}) // 搜索数组
db.g_test.ensureIndex({"address.city":1}) // 在嵌套文档的字段上建索引
1-5-4. 更新数据:
db. 集合名.update({},{})更新对象,第一个参数是查询对象,第二个是替代的,可以在第二个对象里指定更新哪些字段,要使用$set。
1-5-5. 删除条件查询:
db. 集合名.remove({name:”guo3”}); //是用来删除数据,只删除匹配的对象
1-5-6. 删除数据集合(表):
db. 集合名.drop();
1-5-7. 删除当前数据库:
db.dropDatabase();
总的来说,使用mongodb可以满足常见的增删改查,但是不能完成复杂的跨表级联查询,mongodb努力使数据变得简单紧凑。 |