?BSON Types 和 MongoDB Data Types

1.BSON TYPE 简介

BSON是一种二进制序列化格式,用于存储文档并在MongoDB中进行远程过程调用。 

每个BSON类型都有整数和字符串标识符,如下表所示:

1542289586170373.png

可以将这些值与$ type运算符一起使用,可以按BSON类型来查询文档。

2. ObjectId

ObjectId值由12个字节组成,其中前四个字节是反映ObjectId创建的时间戳。12个字节的组成如下;

一个4字节的值,表示自Unix纪元以来的秒数;

一个3字节的机器标识符;

一个2字节的进程ID;

一个3字节的计数器,以随机值开始;

在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id字段作为主键。如果插入的文档省略了_id字段,MongoDB会自动为_id字段生成ObjectId。

MongoDB客户端应该添加一个具有唯一ObjectId的_id字段。ObjectIds字段可提供以下好处:

可以使用ObjectId.getTimestamp()方法访问ObjectId的创建时间;

在存储ObjectId值的_id字段上排序大致相当于按创建时间排序;

3. String

BSON字符串是基于UTF-8的, 通常,在序列化和反序列化BSON时,MongoDB 会将字符串格式转换为UTF-8。 这可以轻松地将国际字符存储在BSON字符串中。 此外,MongoDB 操作符$ regex查询在正则表达式字符串时支持UTF-8。

4. Timestamps

BSON的 Timestamps类型 经常在 MongoDB数据库内部使用,该类型与Date类型无关。Timestamps的值是64位值,组成如下:

前32位是time_t值(自Unix纪元以来的秒数);

后32位是给定秒内操作的递增序数;

在单个mongod实例中,timestamps的值是唯一的。

在Replication中,oplog具有ts字段。此字段中的值反映了使用BSON时间戳值的操作时间。

如果在第一层的字段中插入包含空BSON时间戳的文档,MongoDB将使用当前时间戳值替换该空时间戳。例如,如果创建插入带有时间戳值的文档,如以下操作:

var a = new Timestamp();
db.test.insertOne({ts:a});
db.test.find()操作将返回类似于以下内容的文档:
{“_ id”:ObjectId(“542c2b97bac0595474108b48”),“ts”:Timestamp(1412180887,1)}

5. Date

BSON Date是一个64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数。

Mongo shell提供了各种方法来返回日期类型,可以是字符串,也可以是Date对象:

Date()方法,以字符串形式返回当前日期;

new Date()构造函数,它使用ISODate()返回Date对象;

ISODate()构造函数,它使用ISODate()返回Date对象;

以字符串形式返回日期

要将日期作为字符串返回,使用Date()方法,如以下示例所示:

var myDateString = Date();

如要打印变量的值,请在shell中键入变量名称,如下所示:

myDateString

结果是myDateString的值:

Wed Dec 19 2012 01:03:25 GMT-0500(EST)

要验证类型,请使用typeof运算符,如下所示:

typeof myDateString

该操作返回String。

返回日期类型

Mongo shell使用ISODate程序来返回Date类型的对象。

以下示例使用新的Date()构造函数和ISODate()构造函数来返回Date对象。

var myDate = new Date();
var myDateInitUsingISODateWrapper = ISODate();

6. NumberLong

Mongo shell默认将所有数字视为浮点值 (floating-point Type)。 NumberLong()接受long作为字符串:

NumberLong(“2090845886852”)

以下示例使用NumberLong()写入集合:

db.collection.insertOne({_ id:10,calc:NumberLong(“2090845886852”)})
db.collection.updateOne({_ id:10},
                       {$ set:{calc:NumberLong(“2555555000000”)}})
db.collection.updateOne({_ id:10},
                       {$ inc:{calc:NumberLong(5)}})

检索文档以验证:

db.collection.findOne({_ id:10})

在返回的文档中,calc字段包含NumberLong对象:

{“_ id”:10,“calc”:NumberLong(“2555555000005”)}

7. 检查mongo Shell中的类型

为了确定字段的类型,Mongo shell提供了instanceof和typeof运算符。

Instanceof

instanceof返回一个布尔值来测试值是否是某种类型的实例。

例如,以下操作测试_id字段是否为ObjectId类型的实例:

mydoc._id instanceof ObjectId

该操作返回true。

Typeof

typeof返回字段的类型。

例如,以下操作返回_id字段的类型:

typeof mydoc._id

在该情况下,typeof将返回更通用的对象类型而不是ObjectId类型。

?BSON Types 和 MongoDB Data Types

发表评论

邮箱地址不会被公开。 必填项已用*标注

× 一 = 十

滚动到顶部