MongoDB -- 一、基础知识
基础知识
- 文档是mongo中数据的基础单元,类似于mysql中的行
- 集合类似于表
- 每个文档都有一个特殊的唯一键
_id
- mongo自带一个JS shell,可用于管理
文档
文档是键值对的一个有序集合,例如:{"greeting" : "Hello, world!"}
- 文档的键是字符串(
\0
不能使用,空字符用于表示键的结尾;.
和$
具有特殊意义是保留字符,尽量避免使用) - 键值不仅区分类型,同样会区分大小写
- 文档不能有重复的键
集合
是一组文档,类似于表的概念
动态模式
集合是动态模式的,一个集合里面的文档可以是各式各样的
1 | {"greeting" : "Hello, world!"} |
以上两个文档可以存储在同一个集合里面,这就和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这样扩展性非常好的数据库,扩展应用仍然会比扩展数据库层容易得多,能在客户端做的事情尽量在客户端做减轻服务器压力