1.BSON TYPE 简介
BSON是一种二进制序列化格式,用于存储文档并在MongoDB中进行远程过程调用。
每个BSON类型都有整数和字符串标识符,如下表所示:
可以将这些值与$ 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类型。