1. MongoDB简介
MongoDB是一个免费开源的跨平台文档数据库,采用文档存储形式(BSON)进行存储。与传统的关系型数据库不同,MongoDB不需要固定的表格结构,可以根据需要动态的添加字段。
2. MongoDB时间储存方式
MongoDB数据库中的日期时间类型被称为ISODate
。其存储格式是一个12-byte的文档,其中前4个字节表示Unix时间戳,后面8个字节表示随机值。在MongoDB中,时间可以按照ISO格式进行查询和存储。
2.1 插入时间数据
在MongoDB中插入时间数据,可以使用ISODate()
函数,代码示例如下:
db.collection.insert({
name: "John",
birthday: ISODate("1990-01-01T00:00:00Z")
})
注意:T00:00:00Z
表示时间的精度为按天计算,时间按照UTC时间来计算。
2.2 查询时间数据
在MongoDB中查询时间数据,可以使用ISODate()
函数,代码示例如下:
db.collection.find({
birthday: ISODate("1990-01-01T00:00:00Z")
})
注意:T00:00:00Z
表示查询的时间是按照UTC时间来查询。
2.3 时间比较
在MongoDB中,可以使用$lt
、$gt
、$lte
、$gte
等操作符对时间进行比较,代码示例如下:
db.collection.find({
birthday: { $gt: ISODate("1980-01-01T00:00:00Z"), $lt: ISODate("1990-01-01T00:00:00Z") }
})
注意:上面的查询结果是指查询1980年到1990年之间的出生日期的人物信息。
3. 新方式:时间储存在64位整数中
在MongoDB 4.0版本中,新增了一种时间储存方式:时间作为64位整数存储。这种存储方式不像ISODate
那样采取文档存储形式(BSON),而是采用二进制字符串的形式存储。
时间作为整数的储存方式有以下优点:
存储空间更小,只需要8个字节,而不是12个字节。
索引的效率更高,可以使用整数类型的索引,而不需要使用文档类型的索引。
使用整数类型的索引可以提高查询速度,因为MongoDB服务器会缓存距离较近的整数值,而不是整个文档。
3.1 插入时间数据
在MongoDB中插入时间数据,可以使用整数类型直接插入,代码示例如下:
db.collection.insert({
name: "John",
birthday: NumberLong(631123200000)
})
注意:这里的NumberLong
函数是为了将整数转换成64位整数类型。
3.2 查询时间数据
在MongoDB中查询时间数据,可以使用$dateToString
函数,代码示例如下:
db.collection.aggregate([
{ $project: { birthdate: { $toDate: "$birthday" } } },
{ $match: { birthdate: { $gte: ISODate("1980-01-01T00:00:00Z") } } }
])
注意:上面的查询结果是指查询1980年以后出生日期的人物信息。
4. 总结
在MongoDB中,时间数据可以使用ISODate
或者64位整数进行存储。使用整数类型的存储方式可以提高查询效率,同时减小存储空间。
但是,在使用64位整数存储时间数据时,需要注意查询时的数据转换问题。如果需要查询某个时间范围内的数据,需要先将查询条件转换成ISODate
格式,然后再进行查询。