關於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也是非常合理的。


分享到:


相關文章: