概述
> db.col.find() { "_id" : ObjectId("56c56dd4ca446fab71e4c38a"), "x" : 1, "y" : 3 } { "_id" : ObjectId("56c572c2ca446fab71e4c38b"), "x" : 2, "y" : 2 } { "_id" : ObjectId("56c572c8ca446fab71e4c38c"), "x" : 3, "y" : 1 } { "_id" : ObjectId("56c5a7beb708aa3d13c61cc7"), "c" : 3, "m" : 1 }
每個文檔中都有一個“_id”,她是一個12字節的BSON類型數據,格式如下
56c56dd4ca446fab71e4c38a
- 前4個字節表示時間戳
- 接下來的3個字節是機器標識碼
- 緊接的兩個字節由進程id組成(PID)
- 最后三個字節是隨機數
MongoDB存儲的文檔必須有一個的“_id”鍵,這個鍵值可以是任意類型,默認的是ObjectId類型對象。
文檔的“_id”是唯一的,以確保集合中的文檔被唯一標識。
MongoDB采用ObjectId,而不是其他比較常規的做法(比如自動增加的主鍵)的主要原因,因為在多個服務器上同步自動增加主鍵值既費力還費時。(不同機器可以通過機器名區分,同一個機器通過時間戳、隨機數、進程id區分)
創建新的ObjectId
> newObjectId_1 = ObjectId() ObjectId("56c686d264799370c0ef357b") > newObjectId_2 = ObjectId() ObjectId("56c686d364799370c0ef357c")
可以用已經生成的id取代自動生成的ObjectId
d = ObjectId("56c686d364799370c0ef357c") ObjectId("56c686d364799370c0ef357c")
獲取文檔的時間戳
由於ObjectId的前4位是時間戳,因此不需要為文檔特意的保存時間戳,可以用getTimestamp()獲取
> ObjectId("56c56dd4ca446fab71e4c38a").getTimestamp() ISODate("2016-02-18T07:08:04Z")
ObjectId轉化為時間戳
> new ObjectId().str 56c68c3b64799370c0ef3581 > ObjectId("56c56dd4ca446fab71e4c38a").str 56c56dd4ca446fab71e4c38a