MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型。在不同的编程语言下,这些类型的确切表示有些许差异。
基本类型
- null:用于表示空值或者不存在的字段
{"x":null}
- 布尔型:布尔类型有两个值true和false
{"x":true}
- 数值:shell默认使用64位浮点型数值。因此,以下数值在shell中shell中是很"正常"的:
{"x":3.14}
或
{"x":3}
对于整数值,可使用NumberInt类或NumberLong类:
{"x":NumberInt("3")}
{"x":NumberLong("3")}
- 字符串:UTF-8字符串都可表示为字符串数据类型
{"x":"foobar"}
- 日期:日期被存储为自新纪元以来经过的毫秒数,不存储时区
{"x":new Date()}
- 正则表达式:查询时,使用正则表达式作为限定条件,语法也与JavaScript的正则表达式语法相同
{"x":/foobar/i}
- 数组:数据列表或数据集可以表示为数组
{"x":["a","b","c"]}
- 内嵌文档:文档可嵌套其他文档,被嵌套的文档作为父文档的值
{"x":{"foo":"bar"}}
- 对象id:对象id是一个12个字节的ID,是文档的唯一标识
{"x":ObjectId()}
-
二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非UTF-8字符保存到数据库中,二进制数据是唯一的方式
-
代码:查询和文档中可以包括任意JavaScript代码
{"x":function(){ /* ... */}}
数组
数组是一组值,它即能作为有序对象(如列表、栈或队列),也能作为无序对象(如数据集)来操作。
{"things":["pie, 3.14]}
数组可包含不同数据类型的元素。实际上,常规的键值对对支持的所有值都可以作为数组的值,数组中甚至可以嵌套数组。
内嵌文档
文档可以作为键的值,这样的文档就是内嵌文档。
{
"name":"John Doe",
"address":{
"streect":"123 Park Street",
"city":"Anytown",
"state":"NY"
}
}
_id和ObjectId
MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型,默认是个ObjectId对象。在一个集合里面,每个文档都有唯一的"_id",确保集合里面每个文档都能被唯一标识。如果有两个集合的话,两个集合可以都有一个"_id"的值为123,但是每个集合里面只能有一个文档的"_id"值为123.
ObjectId:
ObjectId是"_id"的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法生成它。
ObjectId使用12字节的存储空间,是一个由24个16进制数字组成的字符串。
生成方式:
0|1|2|3|4|5|6|7|8|9|10|11
时间戳 |机器 |PID|计数器
- ObjectId的前4个字节是从标准纪元开始的时间戳,单位为秒。
- 接下来的3个字节是所在主机的唯一标识符,通常是机器主机名的散列值(hash)。这样就可以确保不同主机生成不同的ObjectId。
- 接下来的2个字节来自产生ObjectId的进城的进程标识符(PID)
前9个字节保证了同一秒种不同机器不同进程产生的ObjectId是唯一的。最后3个字节是一个自动关增加的计数器,确保相同进城同一秒长生的ObjectId也是不一样的。
一秒钟最多允许每个进程拥有2563(1677215)个不同的ObjectId。
MongoDB 是一个支持 JSON 格式数据的文档型数据库,其数据类型包括 null、布尔、数值、字符串、日期、正则表达式、数组、内嵌文档、ObjectID 和二进制数据。文档结构允许内嵌文档和数组,保证数据的灵活性。每个文档都必须包含唯一的 _id 键,通常使用 ObjectId 作为其值,确保文档的唯一性。ObjectId 是由时间戳、机器标识、进程ID和计数器组成,确保全局唯一。
1238

被折叠的 条评论
为什么被折叠?



