// 日期转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也是非常合理的。
閱讀更多 慕課網 的文章