MongoDB 和传统数据库类似,也为字段(列)提供了数据类型,下表为 MongoDB 中常用的几种数据类型:
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式 |
注意:BSON 字符串都是 UTF-8 编码。
String 类型用于表示文本数据。在 MongoDB 中,字符串的长度可以是 0 到 2^31-1 个字符。可以通过两种方式来声明一个 String 类型:
(1)直接把字符串值插入到文档中,例如:
db.users.insert({name: "张三", email: "zhangsan@example.com"})
(2)使用 new String() 构造函数,例如:
var str = new String("Hello World");
Integer 类型用于表示整数数据。在 MongoDB 中,整数的范围是 -2^31 ~ 2^31-1,可以通过两种方式来声明一个 Integer 类型:
(1)直接把整数值插入到文档中,例如:
db.users.insert({age: 28, salary: 10000})
(2)使用 new Number() 构造函数,例如:
var num = new Number(123);
Double 类型用于表示浮点数数据。在 MongoDB 中,浮点数的范围是 -1.7976931348623157E+308 ~ 1.7976931348623157E+308,可以通过两种方式来声明一个 Double 类型:
(1)直接把浮点数值插入到文档中,例如:
db.products.insert({price: 9.99, weight: 2.5})
(2)使用 new Number() 构造函数,并将参数设置为浮点数,例如:
var num = new Number(3.14);
Boolean 类型用于表示逻辑数据,即 true 或 false。在 MongoDB 中,可以通过两种方式来声明一个 Boolean 类型:
(1)直接把布尔值插入到文档中,例如:
db.users.insert({isManager: true, isAdmin: false})
(2)使用 new Boolean() 构造函数,例如:
var b1 = new Boolean(false); var b2 = new Boolean(true);
Null 类型用于表示空值。在 MongoDB 中,可以直接把 null 值插入到文档中,例如:
db.users.insert({gender: null})
Object 类型用于表示嵌套文档数据。在 MongoDB 中,可以使用花括号 {} 来声明一个 Object 类型。例如:
db.users.insert({name: "张三", address: {city: "北京", street: "天安门"}})
Array 类型用于表示多个值的列表数据。在 MongoDB 中,可以使用方括号 [] 来声明一个 Array 类型。例如:
db.users.insert({name: "张三", scores: [80, 85, 90]})
需要注意的是,MongoDB 数组可以包含不同的数据类型。例如:
db.users.insert({name: "张三", data: [null, "Hello", 123]})
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,如下图:
其中:
前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
接下来的 3 个字节是机器标识码
紧接的两个字节由进程 id 组成 PID
最后三个字节是随机数
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间,例如:
> var obj = new ObjectId() > obj.getTimestamp() ISODate("2023-08-22T05:39:27Z")
如何将 ObjectId 转为字符串,例如:
> var obj = new ObjectId() > obj.str 64e44a0f7b7adad005847ad3
BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的日期类型不相关。时间戳值是一个 64 位的值。其中:
前32位是一个 time_t 值(与 Unix 新纪元相差的秒数)
后32位是在某秒中操作的一个递增的序数
在单个 mongod 实例中,时间戳值通常是唯一的。在 MongoDB 复制集中,oplog 有一个 ts 字段,这个字段中的值使用 BSON 时间戳表示了操作时间。
BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。
在 MongoDB 中,可以使用 Timestamp() 函数来声明一个 Timestamp 类型。例如:
db.events.insert({eventName: "click", timestamp: Timestamp(1641043600, 1)})
MongoDB 中的日期表示当前距离 Unix 新纪元(1970年1月1日)的毫秒数。日期类型是有符号的,负数表示 1970 年之前的日期。例如:
# 格林尼治时间 > var d1 = new Date() > d1 ISODate("2023-08-22T05:44:31.788Z") > typeof d1 object # 格林尼治时间 > var d2 = ISODate() > d2 ISODate("2023-08-22T05:44:48.835Z") > typeof d2 object # 日期转为字符串 > d1.toString() Tue Aug 22 2023 13:44:31 GMT+0800 > typeof d1.toString() string > Date() Tue Aug 22 2023 13:46:32 GMT+0800 > typeof Date() string