MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
这里提及一下分布式的优点:
- 可靠性(容错) :
分布式计算系统中的一个重要的优点是可靠性。一台服务器的系统崩溃并不影响到其余的服务器。 - 可扩展性:
在分布式计算系统可以根据需要增加更多的机器。 - 资源共享:
共享数据是必不可少的应用,如银行,预订系统。 - 灵活性:
由于该系统是非常灵活的,它很容易安装,实施和调试新的服务。 - 更快的速度:
分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度。 - 开放系统:
由于它是开放的系统,本地或者远程都可以访问到该服务。 - 更高的性能:
相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)。
分布式的缺点:
- 故障排除:
故障排除和诊断问题。 - 软件:
更少的软件支持是分布式计算系统的主要缺点。 - 网络:
网络基础设施的问题,包括:传输问题,高负载,信息丢失等。 - 安全性:
开放系统的特性让分布式计算系统存在着数据的安全性和共享的风险等问题。
Why NoSQL ?
NoSQL用于超大规模数据的存储。如果要进行数据的爬取和访问,用户生成的数据和用户操作日志已经成倍增加.传统的数据库已经不在适合这些应用了.NOSQL数据库的发展却也能很好的处理这些大的数据
CAP定理[待深入理解]
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
所以这样,根据CPA原理将NoSQL数据库分成了CA原则,满足CP原则和满足AP原则
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成
应用
- 纽约时报
- CERN,著名的粒子物理研究所
- 等
练习:
使用数据库(如果没有的话就自动创建数据库)
- use test
查看数据库
- show dbs
返回当前数据库
- db.getName()
发现没有之前创建的数据库,向数据库中插入一条数据就可以查到了
方法一:
- db.test.insert({“name”:”aaa”})
注:batchinsert()方式在3.2之后的版本似乎已废除
方法二:
- 建立一个对象:
- j = { name : “mongo” };
- t = { x : 3 };
把对象保存到集合 hurl 中:
db.test.save(j);
删除制定条件的数据
db.a.remove(name:)
删除数据库的语法是
注 先切换到需要删除的数据库,然后执行以下命令
- db.dropDatabase()
创建集合
先切换到当前数据库
然后db.createCollecion(“name”,”option”)
name是要创建集合的名字,options可选参数,指定有关内存大小和索引的选项
option的选项如下
capped | 布尔 | 可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 |
---|---|---|
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
比如
创建一个固定集合mycol,整个集合的大小为1000kb,文档最大个数为1000个
- db.collection(“mycol”,{capped:true,size:1000,max:1000})
索引
索引信息被保存在system.indexes 中,_id 是创建表的时候自动创建的索引,此索引是不能够删除的,
创建索引
db.collection.ensureIndex({KEY:1})
key为你所要创建的索引字段,1 为指定按升序创建索引.
当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定“backgroud:true”即可。
如:- db.t3.ensureIndex({age:1} , {backgroud:true})
删除索引
- db.collections.dropIndex({“name”:1})
返回索引信息
db.colletion.getIndexes()
explain执行计划
MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。
查找
指定的值
- db.test.find({name:”Bob”})
指定需要返回的键
有的时候并不需要将文档中所有的键和值都返回,这样指定的话既会节省传输的数据量,又能节省客户端解码文档的时间和消耗的内存.
比如只对用户的nama和email感兴趣
* db,test,find({“name”:1,”email”:1})
查询方法
skip(number) 跳过前面的前number条数据
limit(number)一般和skip()搭配起来使用,显示number条
条件查找
等于
- db.collection.find({“name”:”zhangsan”})
大于
例如
- db.test.find({age : {$gt:”20”}}).pretty()
capped | 布尔 |
---|---|
小于 | {:{$lt:}} |
小于或等于 | {:{$lte:}} |
大于 | {:{$gt:}} |
大于或等于 | {:{$gte:}} |
不等于 | {:{$ne:}} |
$and –多个条件都满足
db.dbs.find({and:[{"age":{ and:[{"age":{ gt:30}},{"age":{$lt:40}}]}).pretty()
//查出文档中存在的两个键的值相同的文档,JavaScript 函数会遍历集合中的文档:
db.fruit.find({$where:function () {
for (var current in this) {
for (var other in this) {
if (current != other && this[current] == this[other]) {
return true;
}
}
}
return false;
}});
$type –字段类型查询
类型 | 类型 | 编号 |
---|---|---|
Double | 数字类型 | 1 |
String | 字符串 | 2 |
undefined | 未定义类型 | 6 |
Object id | 对象 id | 7 |
Boolean | 布尔值 | 8 |
Date | 日期 | 9 |
Null | Null | 10 |
NumberInt/NumberLong | 整型 | 16 |
比如 查看“_id”为“对象”的所有数据
- db.test.find({_id:{$type:7}}).pretty()
查看“name”为“字符串”的所有数据
- db.test.find({name:{$type:2}}).pretty()
查询记录数
- db.test.find().pretty().count()
正则表达式查询
模糊查询
查找“name”中包含字母“o”的数据
- db.test.find({“name”:/o/}).pretty()
ObjectId的12个字节按照如下方式来生成
01234|456|78|91011
时间戳|机器|PID|计数器
ObjectId的前四个字节是从标准纪元开始的时间戳,单位为秒
时间戳,与随后的5字节组合起来,提供了秒级别的唯一性
使用修改器[待深入学习,其实东西还是挺多的]
如果一个文档只会有一部分要更新,就可以使用原子性的更新器来完成.制定对文档中的某些字段进行更新,更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改,增加,或者删除键.
{
"_id":Object(""),
"url":"www.google.com"
"pageviews":100
}
如果每次都有人来访问这个页面,就通过URL找到该页面,并用"$inc"修改器来增加pageviews的值
db.test.update({"url":"www.google.com"},
...{"$inc":{"pageviews":1}})
就会发现这个会增加1