MongoDB——数据类型详解

MongoDB 是一个支持 JSON 格式数据的文档型数据库,其数据类型包括 null、布尔、数值、字符串、日期、正则表达式、数组、内嵌文档、ObjectID 和二进制数据。文档结构允许内嵌文档和数组,保证数据的灵活性。每个文档都必须包含唯一的 _id 键,通常使用 ObjectId 作为其值,确保文档的唯一性。ObjectId 是由时间戳、机器标识、进程ID和计数器组成,确保全局唯一。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值