关于mongodb的一些常见话题深入

// 日期转ObjectId

function timeToObjectId(date) {

let seconds = Math.floor(date.getTime() / 1000);

// 将时间戳(s)转化为十六进制,再补充16个0

return seconds.toString(16) + '0000000000000000';

}

// ObjectId转时间,mongo本身可以直接获取

ObjectId("5b72c9169db571c8ab7ee374").getTimestamp();

ObjectId的构成特性给我们带来了一些额外的思考,关于文档维护一个createTime字段是否有必要?这实际上需要视场景而定。一个时间戳是8个字节,一个ObjectId是12字节,在不缺磁盘空间的今天,增加一个createTime不会带来多少负担,但可以更直观地观察到文档的创建时间,如果创建时间需要被展示到业务场景中,每次通过ObjectId去转换也是相当吃力不讨好。更进一步,如果有按照创建时间建立复合索引的用途,时间戳也要比ObjectId节省近30%的内存使用量。当然,如果业务场景不关注创建时间,仅仅需要获取某个时间段创建的记录,那么只使用ObjectId也是非常合理的。


分享到:


相關文章: