Mongodb

基础知识

  • 文档是mongo中数据的基础单元,类似于mysql中的行
  • 集合类似于表
  • 每个文档都有一个特殊的唯一键_id
  • mongo自带一个JS shell,可用于管理

文档

文档是键值对的一个有序集合,例如:{"greeting" : "Hello, world!"}

  • 文档的键是字符串(\0不能使用,空字符用于表示键的结尾;.$具有特殊意义是保留字符,尽量避免使用)
  • 键值不仅区分类型,同样会区分大小写
  • 文档不能有重复的键

集合

是一组文档,类似于表的概念

动态模式

集合是动态模式的,一个集合里面的文档可以是各式各样的

1
2
{"greeting" : "Hello, world!"}
{"foo" : 5}

以上两个文档可以存储在同一个集合里面,这就和mysql大不相同了,既然所有结构的文档都可以存储在同一个集合里面,那集合这个层级存在的意义是什么

  • 方便管理,对开发者来说也是很好的数据隔离策略
  • 分开存储在查询效率上会更高
  • 相同类型的文档在逻辑上存在关联,放到一起存储方便批量的查询(同样会被写入磁盘)
  • 方便索引的创建

其实本质还是关系型数据库思维大行其道,当前的程序设计都是在这个基础上搭建的,导致mongo只能去迎合,不然就会成为小众服务

命名

本质上没什么特别的,和key一样别用\0 . $,且别以system.进行开头,这是系统集合保留前缀

子集合

比如blog.posts和blog.authors,这两个集合都是博客系统的,但本质上和叫blog的集合没有关系(很可能根本没有这个集合),类似于命名空间

数据库

没啥好说的

shell简介

类似于mysql的命令行交互模式,不过mongo的shell说基于javascript的,所有支持所有js原生库,它是mongo的一个客户端,可以在里面进行操作

mongo的继承操作命令就不放到这里了

数据类型

基本数据类型

  • null

    {"x" : null}

  • 布尔:只有两个值true和false

  • 数值:默认会使用64位浮点数,也可以显式的指定

    1
    2
    {"x" : NumberInt("3")}
    {"x" : NumberLong("3")}
  • 字符串

  • 日期:精确度为毫秒

  • 正则表达式:{"x" : /foobar/i} 这个给我整不会了,后面再看使用场景吧

  • 数组

  • 内嵌文档

  • 对象ID:{"_id" : ObjectId()} 12字节的ID,文档的唯一标识

    • ObjectId是’_id’的默认类型,不同的机器都能用全局唯一的同种方法方便地生成它,由于mongo在设计的时候就是分布式数据库,所以没有使用通用的自增主键,虽然更节省空间,但是在分布式节点上维护其唯一性更麻烦一些
    • 使用12字节的存储空间,由24个十六进制数字组成的字符串
    • 如果文档插入时没有指定_id系统会自动生成一个,但更建议在客户端进行生成,即使是对mongo这样扩展性非常好的数据库,扩展应用仍然会比扩展数据库层容易得多,能在客户端做的事情尽量在客户端做减轻服务器压力