基本概念
集合(collection)类似于关系型数据库的表,它是无模式的。
文档(doucument)是MongoDB中数据的基本单元,类似于关系型数据库中的行。
虽然集合是无模式的,但是仍然需要使用多个集合,原因如下:
- 把各种各样的文档都混在一个集合里面,不利于整理。
- 在一个集合里查询特定类型的文档在速度上很不划算,分开做多个集合要快得多。
- 把同种类型的文档放在一个集合里,这样数据在磁盘上的存储会更加集中,访问速度更快。‘
- 把同种类型的文档放在一个集合里,方便建立高效的索引。
数据类型
- null
null用于表示空值或者不存在的字段
- 布尔(略)
- 32位整数
由于JavaScript仅支持64位浮点数,所以JavaScript shell不支持32位整数,会被自动转换。
- 64位整数
shell不支持此类型,会使用一个特殊的内嵌文档来显示64位整数,如
{
"_id":ObjectId("4c0beecfd096a2580fe6fa09"),
"myInteger":{
"floatApprox":92233720368547766000,
"top":2147483647,
"bottom":4294967295
}
}
- 64位浮点数(略)
- 字符串
UTF-8字符串
- 符号
shell不支持,自动转换成字符串
- 对象id
- 日期
日期类型存储的是从标准纪元开始的毫秒数,不存储时区。
- 正则表达式
文档中可以包含JavaScript正则表达式
- 代码
文档中可以包含JavaScript代码
- 数组
值的集合或者列表可以表示成数组
- 内嵌文档
文档可以包含别的文档,也可以作为值嵌入到父文档中。
_id和ObjectId
ObjectId是“_id”的默认类型。ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。12字节按照如下方式生成:
- 前4个字节是从标准纪元开始的时间戳,单位为秒。
- 随后3个字节是所在主机的唯一标识符,通常是机器主机名的散列值。
- 接下来2个字节是产生ObjectId所在的进程标识符
- 最后3个字节是自动增加的计数器