凌云的博客

成功=工作+游戏+少说空话

MongoDB入门

分类:database| 发布时间:2014-05-06 22:55:44


NoSQL简介

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写, 是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。 (例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。 这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

CAP定理

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理, 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

MongoDB简介

MongoDB是由C++语言编写的开源数据库系统。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB将数据存储为一个文档。MongoDB是一个基于分布式文件存储的数据库。

安装MongoDB

Ubuntu下可以通过命令:

$sudo apt-get install mongodb

进行MongoDB的安装,其他的系统可以到 MongoDB官网 进行下载。

MongoDB基本概念

数据库

一个MongoDB中可以创建多个数据库,在使用数据库之前不需要先创建。

可以通过show dbs查看所有的数据库,而通过db命令查看当前的数据库:

 $mongo
 MongoDB shell version: 2.4.9
 connecting to: test
 > show dbs
 local  0.078125GB
 test   0.203125GB
 > use mydb
 switched to db mydb
 > show dbs
 local  0.078125GB
 test   0.203125GB
 > db
 mydb
 > use test
 switched to db test
 > db
 test
 > 

文档

文档是MongoDB中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一行数据。 多个键及其关联的值有序的放置在一起就是文档。在MongoDB中使用一种类JSON的BSON存储数据。

集合

集合就是一组文档的组合。如果将文档类比成数据库中的行,那么集合就可以类比成数据库的表。 在MongoDB中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的, 比如下面的两个文档可以同时存入到一个集合中:

{"name":"mengxiangyue"} {"Name":"mengxiangyue","sex":"nan"} 

当第一个文档插入时,集合就会被创建。

合法的集合名
  • 集合名称必须以字母或下划线开头。
  • 集合名可以保护数字
  • 集合名称不能使美元符"$","$"是系统保留字符。
  • 集合的名字 最大不能超过128个字符 。
子集合

可以通过"."号来创建子集合。例如你有一个gps集合,你可以使用gps.spot,gps.city来更好地组织集合。

MongoDB中常用的数据类型

数据类型                    描述
string              可以是一个空字符串或者字符组合
integer             整数
boolean             逻辑值 True 或者 False
double              双精度浮点型
null                不是0,也不是空
array               数组
object              对象型,可以是一个值,变量,函数,或者数据结构。
timestamp           timestamp存储为64为的值。前32位保存的是UTC时间,单位是秒,
                    后32位是在这一秒内的计数值,从0开始,
                    每新建一个MongoTimestamp对象就加一
Internationalized   UTF-8 字符串。
Strings
Object IDs          在mongodb中的文档需要使用唯一的关键字_id来标识他们

MongoDB的增删改查

插入数据

> use mydb
switched to db mydb
> db.users.insert({"name":"zhangsan","age":22})
> db.users.insert({"name":"lisi","age":33})
> db.users.insert({"name":"wangwu","age":"Unknown"})
> db.users.insert({"name":"zhaoliu","age":"Unknown"})

更新数据

MongoDB数据更新可以使用update()函数。

db.collection.update(criteria, objNew, upsert, multi)

update()函数接受以下四个参数:

  • criteria : update的查询条件,类似sql update查询内where后面的
  • objNew : update的对象和一些更新的操作符(如$,$inc...)等, 也可以理解为sql update查询内set后面的
  • upsert : 这个参数的意思是,如果不存在update的记录, 是否插入objNew,true为插入,默认是false,不插入
  • multi : mongodb默认是false,只更新找到的第一条记录, 如果这个参数为true,就把按条件查出来多条记录全部更新

比如我要将"wangwu"的年龄更新为40:

> db.users.update({"name":"wangwu"},{"name":"wangwu","age":40})
> db.users.find({"name":"wangwu"})
{ "_id" : ObjectId("53690ef81a319ed396c457f4"), "name" : "wangwu", "age" : 40 }

删除数据

删除特定数据

可以通过 db.collection.remove(criteria) 删除数据,比如:

> db.users.remove({"name":"wangwu"})
删除所有数据

如果要删除集合中的所有数据可以这样:

> db.users.remove({})
删除集合
> db.users.drop()
删除数据库
> db.dropDatabase()

查询数据

查询集合中的数据

> db.users.find()
{ "_id" : ObjectId("53690e9f1a319ed396c457f2"), "name" : "zhangsan", "age" : 22 }
{ "_id" : ObjectId("53690ee61a319ed396c457f3"), "name" : "lisi", "age" : 33 }
{ "_id" : ObjectId("53690ef81a319ed396c457f4"), "name" : "wangwu", "age" : 40 }
{ "_id" : ObjectId("536971b1c957383ca887805f"), "name" : "zhaoliu", "age" : "Unknown" }

通过特定条件查询

> db.users.find({"name":"lisi"})
{ "_id" : ObjectId("53690ee61a319ed396c457f3"), "name" : "lisi", "age" : 33 }
MongoDB操作符

MongoDB中条件操作符有:

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte

例子:

> db.users.find({"age":{$gte:30}})
{ "_id" : ObjectId("53690ee61a319ed396c457f3"), "name" : "lisi", "age" : 33 }
{ "_id" : ObjectId("53690ef81a319ed396c457f4"), "name" : "wangwu", "age" : 40 }

此外,MongoDB还有用于查询特性类型数据的操作符 $type。 $type操作符是基于BSON类型来检索集合中匹配的结果。

MongoDB中可以使用的类型:

类型描述                    类型值
Double                      1
String                      2
Object                      3
Array                       4
Binary data                 5
Object id                   7
Boolean                     8
Date                        9
Null                        10
Regular expression          11
JavaScript code             13
Symbol                      14
JavaScript code with scope  15
32-bit integer              16
Timestamp                   17
64-bit integer              18
Min key                     255
Max key                     127

比如,我们要查找所有age字段类型为Double的文档:

> db.users.find({"age":{$type:1}})
{ "_id" : ObjectId("53690e9f1a319ed396c457f2"), "name" : "zhangsan", "age" : 22 }
{ "_id" : ObjectId("53690ee61a319ed396c457f3"), "name" : "lisi", "age" : 33 }
{ "_id" : ObjectId("53690ef81a319ed396c457f4"), "name" : "wangwu", "age" : 40 }