教程: http://www.runoob.com/mongodb/mongodb-tutorial.html
MongoDB Driver Quick Tour : http://mongodb.github.io/mongo-csharp-driver/2.3/getting_started/quick_tour/
- 关系型数据库遵循ACID规则
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
1、A (Atomicity) 原子性 : 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做
2、C (Consistency) 一致性 : 约束??
事务的运行不会改变数据库原本的一致性约束。例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。
3、I (Isolation) 独立性: 多事务并发策略,事务之间不受影响。
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务(B)要访问的数据正在被另外一个事务修改(A),只要另外一个事务(A)未提交,它所访问的数据就不受未提交事务(A)的影响。
比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。
4、D (Durability) 持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
- CAP定理(CAP theorem):对于一个分布式计算系统来说,不可能同时满足以下三点(最多只能同时较好的满足两个):
一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
Mongo是cp:CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。
- RDBMS MongoDB比较
数据库 数据库
表格 集合
行 文档
列 字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )
- capped collections
自动维护集合中对象的插入顺序,在创 建时要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象。
它非常适合类似记录日志的功能
- 元数据
数据库的信息是存储在集合中。它们使用了系统的命名空间
- MongoDB 数据类型
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Object 用于内嵌文档。
Object ID 对象 ID。用于创建文档的 ID
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
- MongoDB 创建数据库
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
- 如果你想查看所有数据库,可以使用 show dbs 命令
向 runoob 数据库插入一些数据: db.runoob.insert({"name":"菜鸟教程"})
以下实例删除了 runoob 数据库中的集合 site:
> use runoob
switched to db runoob
> show tables
site
> db.site.drop()
true
> show tables
- 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
- MongoDB 关系:1:1 (1对1);1: N (1对多);N: 1 (多对1);N: N (多对多)
嵌入式关系:这种数据结构的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。
引用式关系:通过引用文档的 id 字段来建立关系。
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。
MongoDB 查询文档使用 find() 方法。
MongoDB 的 find() 方法第一个参数,可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
MongoDB OR 条件语句使用了关键字 $or
find第二个参数, 要返回的字段设置为 1,否则是0.
例如:id不要,只返回name和alexa字段
or x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
print(x)
- MongoDB 复制:将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
- 分片
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
- MongoDB 数据库引用
{
"_id":ObjectId("53402597d852426020000002"),
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "runoob"},
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin"
}
address DBRef 字段指定了引用的地址文档是在 runoob 数据库下的 address_home 集合,id 为 534009e4d852427820000002。
- MongoDB 覆盖索引查询:
所有出现在查询中的字段是索引的一部分;查询返回字段在同一个索引中
MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。
因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取数据要快得多。
例子:创建联合索引,字段为 gender 和 user_name :
索引会覆盖以下查询: >db.users.find({gender:"M"},{user_name:1,_id:0}) => id标明不返回查询结果
索引不会覆盖以下查询:>db.users.find({gender:"M"},{user_name:1}) => id是返回查询结果
- MongoDB 查询分析
MongoDB 查询分析可以确保我们所建立的索引是否有效,是查询语句性能分析的重要工具。
MongoDB 查询分析常用函数有:explain() 和 hint()。
- MongoDB 原子操作
mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。
所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。
参考例子,使用$inc,$push原子操作命令,实现了多个字段同步更新(原子操作)。
- MongoDB 高级索引
参考例子,分别作了:
1. 索引数组字段 -> 数组中的每个字段依次建立索引
2. 索引子文档字段 -> 子文档字段建立索引
- MongoDB Map Reduce: 我的理解就是分布式计算
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。
- MongoDB 全文检索
全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
- MongoDB 正则表达式
MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式
- MongoDB GridFS
GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。
ridFS 可以更好的存储大于16M的文件。