2013-04-23 45 views
10

存儲在每個文檔的_id字段中的自動生成的BSON ID是否是GUID? 該文件說明其'最有可能獨特',所以我有點困惑。爲什麼他們會使用不能保證唯一的ID?是Mongodb ObjectIds GUID?

+1

它是保證是獨一無二的,至少我從來沒有見過一個真正的碰撞。有很多關於編碼究竟是什麼的文檔。 – 2013-04-23 05:19:12

+1

即使GUID也不能保證它的獨特性,但它們的形式可能始終是唯一的。 – Devesh 2013-04-23 05:39:39

回答

0

ObjectId存在於文檔here解釋。由於MongoDB沒有強制唯一性來節省時間,因此不能保證是唯一的。它只是相信複雜的生成算法可能永遠不會在同一個數據存儲區中生成兩個相同的ObjectId。所以在技術上它不是一個GUID,但非常好。

6

其唯一性基於概率。不像@mattexx回答:

它不是「保證」是唯一的,因爲MongoDB不強制唯一性來節省時間。

MongoDB的DOES執行uniqness上ObjectId,它實際上對_id領域唯一索引。在談到節省時間時,ObjectId以這種方式是歷史的,因爲它是在MongoDB沒有確認任何寫入的時候設計的,並且需要99%的機會在沒有客戶端等待確認的情況下插入新的唯一記錄ObjectIds是客戶端生成的)。

他們不是然而的GUID他們作爲@Asya說,都保證有uniqness高水平。

只要時間永遠向後移動仍然有99%的機會將是唯一的永恆。好吧,正如@Devesh所說,有1萬億(還沒有完成數學計算),即使是一個GUID被重複的機會,但我認爲你不會很快達到這個概率。

1

ID衝突的機會是理論上足夠接近零,它可以推定爲典型的Web應用程序。許多真實世界的系統(不管是否使用Mongo)都依賴於GUID的這個屬性,儘管這對於安全/任務關鍵型系統來說不是一個好的假設。

實用實際上,如果存在錯誤配置或第三方庫錯誤,確實會出現錯誤。這些不應該排除這個概念,但重要的是要意識到這些風險,並在可能的情況下避免這些風險。

一些good analysis here的可能導致碰撞的實際問題。特別是:

一些Mongo驅動程序使用隨機數而不是遞增計數器字節數。在這些情況下,生成非唯一ID的機會爲1/16777216,但是隻有在同一秒內生成這兩個ID(即在ID的時間段更新到下一秒之前)的情況下,才能生成非唯一ID機器,在同一個過程中。