说到MongoDB,就必须先说清楚NoSQL,以下介绍NoSQL的部分源自百度百科。
一 NoSQL
NoSQL,泛指非关系型数据库。(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
虽然NoSQL流行语火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动。尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟、稳定。不过现在也面临着一个严酷的事实:技术越来越成熟——以至于原来很好的NoSQL数据存储不得不进行重写,也有少数人认为这就是所谓的2.0版本。这里列出一些比较知名的工具,可以为大数据建立快速、可扩展的存储库。
NoSQL数据库的四大分类
1 键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
2 列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
3 文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
4 图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。 如:Neo4J, InfoGrid, Infinite Graph.
因此,总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。
下面给出一张对比图:
二 MongoDB简介
MongoDB的优点(为什么使用MongoDB):
“宽松”的数据存储形式非常灵活,MongoDB不限制每个key对应的values的数目。比如一个博客系统,有的文章没有评论,则它的值就是一个空集,有的文章评论很多,也可以无限制地插入。更灵活的是,MongoDB不要求同一个集合(collection,相当于SQL的table)里面的不同document有相同的key,比如除了上述这种文档组织,有的文档所代表的文章可能没有likes这个项目,再比如有的文章可能有更多的项目,比如可能还有dislikes等等。这些不同的文档都可以灵活地存储在同一个集合下,而且查询起来也异常简单,因为都在一个文档里,不用进行各种跨文档查询。而这种MongoDB式的存储也方便了数据的维护,对于一篇博客文章来说,所有的相关数据都在这个document里面,不用去考虑一个数据操作需要involve多少个表格。
当然,除了上述的优点,MongoDB还有不少别的优势,比如:MongoDB的数据是用JSON(Javascript Object Notation)存储的(就是上面的这种key-value的形式),而几乎所有的web应用都是基于Javascript的。因此,存储的数据和应用的数据的格式是高度一致的,不需经过转换。更多的优点可以查看:http://www.tutorialspoint.com/mongodb/mongodb_advantages.htm。
mongodb是文档型数据库,集合相当于关系型数据库的表,对象相当于关系型数据库的行。
三 MongoDB常用操作
(这里借鉴了StevenSLXie的MongoDB 极简实践入门一文:https://github.com/StevenSLXie/Tutorials-for-Web-Developers/blob/master/MongoDB%20%E6%9E%81%E7%AE%80%E5%AE%9E%E8%B7%B5%E5%85%A5%E9%97%A8.md,向原作者表示感谢!)
1 在后台启动mongodb服务:
# mongod --dbpath=/data/db --port=27017 --fork --logpath=var/log/mongd.log
日志记录在var/log/mongd.log。
2.退出mongodb服务:
#db.shutdownServer() 或者 kill (forked process id)
3. 命令行工具
本地:
$ mongo
特定ip和端口:
$ mongo ip:port
执行mongo命令后:
4.查看当前有哪些数据库:
> show dbs
show 命令也可以用来跟集合或对象来看它们包含哪些内容。
5.使用某数据库(没有会创建,当在集合中加入数据后才算真正创建成功,对象也是,只有掺入数据后才算创建成功)
> use dbname
6 添加一个集合(collection),如:author (MongoDB里的集合和SQL里面的表格类似):
> db.createCollection('author')
7 删除一个集合(collection),如:author
> db.author.drop()
8.插入数据(无集合时会创建集合)
在use具体数据库后,通过以下命令插入数据:
> db.collectionName.insert({})
比如:
db.movie.insert(
{
title: ‘Forrest Gump’,
directed_by: ‘Robert Zemeckis’,
stars: [‘Tom Hanks’, ‘Robin Wright’, ‘Gary Sinise’],
tags: [‘drama’, ‘romance’],
debut: new Date(1994,7,6,0,0),
likes: 864367,
dislikes: 30127,
comments: [
{
user:’user1’,
message: ‘My first comment’,
dateCreated: new Date(2013,11,10,2,35),
like: 0
},
{
user:’user2’,
message: ‘My first comment too!’,
dateCreated: new Date(2013,11,11,6,20),
like: 0
}
]
}
)
请注意,这里插入数据之前,并不需要先声明movie这个集合里面有哪些项目。直接插入就可以了~这一点和SQL不一样,SQL必须先声明一个table里面有哪些列,而MongoDB不需要。
insert操作有几点需要注意:
- 不同key-value需要用逗号隔开,而key:value中间是用冒号; <