MongoDB是一个跨平台的基于Key_Value键值对形式保存数据的NoSQL文档类型数据库。
NoSQL(not only sql)数据库,泛指非关系型数据库。
l 不需要预定义模式
不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
l 无共享架构
相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
l 弹性可扩展
可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
l 分区
相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
l 异步复制
和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
l BASE
相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
分类 |
Examples举例 |
典型应用场景 |
数据模型 |
优点 |
缺点 |
键值(key-value) |
Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB |
内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 |
Key 指向 Value 的键值对,通常用hash table来实现 |
查找速度快 |
数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 |
Cassandra, HBase, Riak |
分布式的文件系统 |
以列簇式存储,将同一列数据存在一起 |
查找速度快,可扩展性强,更容易进行分布式扩展 |
功能相对局限 |
文档型数据库 |
CouchDB, MongoDb |
Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) |
Key-Value对应的键值对,Value为结构化数据 |
数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 |
查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 |
Neo4J, InfoGrid, Infinite Graph |
社交网络,推荐系统等。专注于构建关系图谱 |
图结构 |
利用图结构相关算法。比如最短路径寻址,N度关系查找等 |
很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
MongoDB数据库有以下特点:
l 跨平台、支持语言众多
l 模式自由
l 支持文件存储
l 易于水平扩展
l 复制集机制
l 多级索引
l 面向集合存储
l 丰富的查询语句
综合以上特点,MongoDB适用于大数据量、高并发、弱事务的互联网应用。
这里主要介绍在windows平台下的安装(其他平台的安装请到官方下载对应的安装介质)。
MongoDB下载地址如下: https://www.mongodb.org/downloads
下载对应的windows平台下的版本。
MongoDBVUE(可视化工具)下载地址:http://www.mongovue.com/downloads/
下载完成之后,直接点击安装即可。
即将MongoDB安装目录的bin目录路径,如下所示:C:\Program Files\MongoDB\Server\3.0\bin
添加到环境变量path中去。要想检测是否添加成功,可以在命令行里,输入Mongo –version查看安装的mongodb的版本号,结果如下图所示:
在启动mongodb之前,需要先为其指定对应的Data(即数据存储)目录,log(日志)目录,目录结构如下图所示:
然后在命令行里输入以下命令:
C:\WINDOWS\system32>mongod --dbpath D:\MangoDB\Data --logpath D:\MangoDB\Log\mongodb.log –logappend
该命令主要是为mongodb指定了数据存储目录和日志目录,在浏览器里输入:
http://localhost:27017
看到如下内容,即表明服务已经启动了:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
如果该命令窗口关闭,则该数据库服务就停止了。但是这样有一个问题,每次开启服务的时候,都需要输入这行命令,会很费事。我们有两种方式去解决这个问题,如下:
l 将以上的命令保存为一个bat文件,每次启动服务的时候点击即可(即上图中所示的Start文件)
l 将MongoDB添加到服务中去,以服务的形式启动,如下所示:
在命令行中输入以下命令:
C:\WINDOWS\system32>mongod --dbpath D:\MangoDB\Data --logpath D:\MangoDB\Log\mongodb.log --install --serviceName "MongoDB"
在命令行里输入:net start MongoDB
结果如下:
输入:net stop MongoDB,停止服务。
MongoDB是面向集合存储的文档型数据库,其基本概念与常用的关系型数据库有所不同。
文档是MongoDB最核心的的概念,本质上是一种类JSON的BJSON格式的数据。
BSON是在JSON的基础上加入了一些新的数据类型,包括日期、int32,int64等。
BSON是由键值对组成,具有轻量性、可遍历、高效性三个特性。
将一组相关的文档放到一起就组成了集合。
文档相当于关系数据库中的一条信息,集合就相当于关系型数据库中的表。
多个文档组成集合,多个集合组成数据库。一个MongoDB示例可以承载多个数据库,每个数据库都有独立的权限。
Null: 空值或不存在的字段
布尔:true或false
数值类型:只支持int32,int64,double
字符串:
二进制数据:可以保存由任意字节组成的字符串
正则表达式:主要用于查询。
例如:{name:/olive/},name字段包含olive
{name:/olive/i},name字段包含olive,且不区分大小写
{name:/^olive/i},name字段以olive开头,且不区分大小写
Js代码
Mongodb中日期是一个64位的整数
Mongodb存储时间时,先转化为utc时间。
Timestamp只供mongodb内部使用,用于记录操作的详细时间,跟date类型没有关系
Objectid由24个十六进制字符构成,每个字节存储两位十六进制数字,总共需要12字节存储空间。
文档作为键的值,称之为内嵌文档。内嵌文档使数据不用保存成扁平结构的键值对,从而使数据组织方式更加自然。
示例:
User={“name”:”olive”,”address”:{“province”:”henan”,”city”:”zhengzhou”}}
这里的示例主要是使用python语言来进行演示。
引入MongoDB对应的Python的驱动,首先安装pymongo包,在命令行里输入:pip install pymongo。安装完成之后在代码里引用。
创建数据库的链接:
# -*- conding:utf-8 -*- import pymongo import sys reload(sys) sys.setdefaultencoding('utf-8') conn = pymongo.MongoClient('localhost', 27017) db = conn.MDB//创建MDB数据库 dt = db.users//创建users数据表
创建完成之后,可以打开MongoVue查看已创建的数据库、数据表如下图所示:
Insert函数只能作用于一个集合,如果该集合不存在,则数据库服务会自动创建。插入时如果没有指定_id的字段,则自动添加该字段。
#insert user0 = { 'name':'Olive','sex':'male', 'age':21 } dt.insert(user0) user1 = { 'name':'Tom','sex':'Female', 'age':24 } dt.insert(user1) user2 = { 'name':'Jack','sex':'male', 'age':25 } dt.insert(user2) user3 = { 'name':'Kite','sex':'male', 'age':20 } dt.insert(user3)
在MongoVUE查看已插入的数据,如下图所示:
除此之外,也可以给insert方法传入一个list参数,如下:
dt.insert([{'name':'Kobe','age':37},{'name':'Jim','age':30}])
再次查看MongoVUE,如下图所示(新增2条数据):
如果要大批量的插入数据也可以使用insert_many()方法,使用如下:
users = [{'name': 'Olive'+str(i)} for i in xrange(101)]
dt.insert_many(users)
修改聚集内的记录:
dt.update( filter, update_field, upsert, multi )
filter : update的查询条件
update_field:要更新的字段、更新值(类似于sql语句中的set)
upsert:如果不存在update的记录,true为插入,false为不插入,默认为false
muti:查出多条数据,如果为true则更新所有数据,默认为false只更新一条数据
dt.update({'name':'Olive'},{'$set':{'age':100}})
$set:更新指定字段值
用法:{ $set : { field : value } }
$unset:删除指定字段
用法:{ $unset : { field : 1} }
$inc:更新指定字段的值,对指定的字段+value
用法:{ $inc : { field : value }
Find({},{})
第一个{} 放where条件 第二个{} 指定那些列显示和不显示 (0表示不显示 1表示显示)
user = dt.find({'name':'Olive'})
结果如下图:
user = dt.find({'name':'Olive','age':{'$lt':90}})
user =dt.find({'$or':[{'name':'Olive'},{'age':{'$lt':50}}]})
先插入一条有内嵌字段的文档
dt.insert_one({'name': '111','address':{'princience':'Beijing','city':'Beijing'}})
示例如下:
user = dt.find({'address.city':'Beijing'})
user =dt.find({'name':{'$in':['Olive','Tom','Jack']}})
user =dt.find({'name':{'$nin':['Olive','Tom','Jack']}})
user = dt.find().sort('name',pymongo.ASCENDING)//单个字段
user = dt.find().sort([('name',pymongo.ASCENDING),('age',pymongo.DESCENDING)])//多个字段
user = dt.find({"name": /"Olive"/})
只查找一条信息。
示例:
user = dt.find_one({'name':'Olive'})
print user['name']
结果如下:
“Olive”
关于一篇mongodb的快速上手的文章,写到这里基本上就结束了,希望能够希望快速上手mongodb的朋友以帮助。这篇文章的示例都是用python+mongodb写的,当然mongodb官方还有对其他语言的适配,这里只是为了方便演示。有兴趣的朋友可以去mongodb的官网去看一下,以便进一步的研究。