套娃关系 文档、集合、数据库 - qianjiahao/MongoDB GitHub Wiki
文档(小套娃)
文档是MondoDB的核心概念,多个键及其关联的值有序的存放在一起便是文档。可以非常类似关系型数据库里的“行”。
吐槽
其实文档要比“行”复杂的多!
在JavaScript里,文档对象通常长这个样子:
{"greeting":"Hello world"}
- greeting(key)/Hello world(value)
在MongoDB里可能会长这样:
{"greeting":"Hello world","foo":3} {"foo":"3","greeting":"hello world"}
当然,MongoDB里的文档通常会更加的复杂,不过,这里咱们有必要注意几点:
- 文档中的键/值对是有序的,所以上下两个文档是不同的 文档的键是字符串,而值不仅可以使字符串,也可以是其他几种类型的值
- 文档的值不仅可以使字符串,也可以是其他几种类型的值
- 文档的键:
- 不能有\0(因为它表示结尾)
- .和$在特定环境下使用,因为它们是保留字
- 以“_”为开头的键是保留的
- MongoDB不但区分类型,还区分大小写。两个foo的值是不同的,一个数字,一个字符串,两个greeting的键也是不同的(H和h)
小心
MongoDB文档不能有重复的键!
集合(中套娃)
集合就是一组文档,非常类似于关系型数据库里的表。 集合的特点就是无模式,就是说一个集合里可以放各种各样的不同文档。 那么随之来的问题是:“有必要使用多个集合吗?” 答案当然是有啦(暗暗一笑),下面是一些理由
- 把各种文档都存放在一个集合里,太乱!
- 因为乱,所以你一旦需要查询某键的时候,就会太慢!
- 将同类的文档放在一个集合里,逻辑上更合理
- 索引是按照集合来创建的,将同类的东西放入文档可以提高索引的效率
举例
超市里都是把同类的商品放在一起贩卖;数学上也有名为“合并同类项”的方法。
总结
集合是为了更有逻辑的分类不同类型的文档,使得MongoDB的效率提高。
mongodb pub/sub方案
基于mongodb的capped collections和tailable cursor实现发布和订阅的功能。
Capped collections是唯一一种维持插入顺序的集合,其中,如果达到容量最大值,那么就会覆盖第一个元素,也就是说capped collection的行为类似于一个环形队列。一种特殊的cursor类型,称为tailable cursor,可以被用在capped collection上,当完成结果返回时,这种cursor不会关闭,而是会继续等待更多的结果来返回。也就是说如果有新的记录插入到capped collection的话,cursor会自动返回。
注意:
-
Capped collections创建后就不能改变了,如果需要修改固定集合的属性,只能将其删除之后再重建。因此,在创建固定集合前应该考虑好它的大小。
-
对于collections的数据考虑设置一个过期时间,或者采取某种措施来删除已经消费掉的数据。
子集合
通过用"."来按命名空间划分子集合。如: blog有两个集合posts和authors,可以这样:blog.posts,blog.authors
命名
- 不能是空字符串""
- 不能含有\0,(表示结尾)
- 不能以system开头
- 不能有保留字$
数据库(大套娃)
命名
- 不能是空字符串""
- 不能含有\0 . \ / $ ''(空格)
- 全部应该小写
吐槽
因为数据库名最终会变成文件系统里的文件,所以会有这么多限制...
注意
有一些数据库名是保留的,如:admin、local、config