套娃关系 文档、集合、数据库 - 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会自动返回。

注意:

  1. Capped collections创建后就不能改变了,如果需要修改固定集合的属性,只能将其删除之后再重建。因此,在创建固定集合前应该考虑好它的大小。

  2. 对于collections的数据考虑设置一个过期时间,或者采取某种措施来删除已经消费掉的数据。

子集合

通过用"."来按命名空间划分子集合。如: blog有两个集合posts和authors,可以这样:blog.posts,blog.authors

命名

  • 不能是空字符串""
  • 不能含有\0,(表示结尾)
  • 不能以system开头
  • 不能有保留字$

数据库(大套娃)

命名

  • 不能是空字符串""
  • 不能含有\0 . \ / $ ''(空格)
  • 全部应该小写

吐槽

因为数据库名最终会变成文件系统里的文件,所以会有这么多限制...

注意

有一些数据库名是保留的,如:admin、local、config