官术网_书友最值得收藏!

3.3 ObjectId生成器

MongoDB集合中所有的文檔都有一個唯一的_id字段,作為集合的主鍵。在默認情況下,_id字段使用ObjectId類型。如下面的代碼:

這里的_id是自動生成的,其中"5d15767ff4531cb8062f3c93"是ObjectId的16進制編碼形式,該字段總共為12個字節。

為了避免文檔的_id字段出現重復,ObjectId被定義為3個部分:

● 4字節表示Unix時間戳(秒)。

● 5字節表示隨機數。

● 3字節表示計數器(初始化時隨機)。

由此可見,經過多個字段隨機組合后,出現重復的概率是極低的。

對于新插入集合中的文檔,如果沒有包含_id字段,則數據庫服務器會自動生成一個新的ObjectId。但實際上,大多數客戶端驅動都會自行生成這個字段,比如MongoDB Java Driver會根據插入的文檔是否包含_id字段來自動補充ObjectId對象。這樣做不但提高了離散性,還可以降低MongoDB服務器端的計算壓力。另外,在ObjectId的組成中,5字節的隨機數并沒有明確定義,客戶端可以采用機器號、進程號來實現,如圖3-2所示。

圖3-2 ObjectId結構

ObjectId具體如何生成,可以參考下面的代碼:

以上代碼來自MongoDB Java Driver(3.6.2版本)。當然,具體應用也可以使用自動生成的_id,但必須保證_id的唯一性。

主站蜘蛛池模板: 台北县| 泾源县| 遵义县| 武强县| 天台县| 瑞丽市| 兰考县| 繁峙县| 稻城县| 格尔木市| 泽普县| 漾濞| 五华县| 阿勒泰市| 焉耆| 旬阳县| 响水县| 泰安市| 哈巴河县| 洮南市| 赣榆县| 醴陵市| 莒南县| 繁昌县| 缙云县| 兰溪市| 光山县| 合阳县| 桃园县| 香格里拉县| 花莲市| 临汾市| 万源市| 波密县| 莱州市| 分宜县| 黄浦区| 基隆市| 彭阳县| 桑植县| 大邑县|