2011-11-11 62 views

回答

4

docs ...

如果用戶試圖插入文檔,而無需提供_id場, 數據庫會自動生成一個對象ID並將其存儲 的_id領域。

但是,在您自己的值賦給_id ...

的_id值可以是任何類型的,比其他數組的,所以只要是 獨具一格。

更好的問題是,爲什麼你會創建自己的獨特的ID,就可以建立索引並刪除了非常有用的對象ID _id被自動索引?

所有官方車手使用對象ID,它有很多真正好的方面是:

  • 它有一個時間戳內置的(所以你並不需要保存在日期字段 您文件,您可以使用它來按日期排序)。

  • 它是一個「全局的,統一增加的序列號」---即 如果您需要分割您的數據,它仍然是唯一的跨服務器, 等

+0

謝謝您!我是MongoDB的新手,我錯過了你引用的那部分文檔。並感謝您解釋使用ObjectID的好處。不過,我想使用我的ID,因爲它是一個散列(而且我需要將它存儲在我的文檔中),並且它比ObjectID小。 –

+1

很高興爲您提供幫助,顯然它關於什麼最適合您的應用程序,但是我發現ObjectID在很多我第一次開始時就不會想到的情況下非常有用。玩得開心,http://learnmongo.com可能對你也有幫助! –

+0

感謝您的好鏈接! –

2

不,你不能擺脫它,it is there by design,但你可以映射你的唯一標識符int_id本身插入文件時。

2

一個好主意是將你的散列存儲到_id字段中。

因此,數據庫不會自動創建_id字段,因爲它已經存在,您將保存未使用索引的空間。

只需將_id字段設置爲所需的值(例如您的散列)。但要小心,它需要是獨一無二的!

爲了確保唯一性,你要麼使其獨特或放一個子文檔的_id領域: {_id:{H:[yourHash],U:唯一標識符]},...}

+0

這正是我所做的,一槍殺死兩隻鳥:我的文檔不包含龐大的ObjectID,每次插入後我都不需要調用'ensureIndex' - 我得到了顯着的加速(我永遠不會想'ensureIndex '太慢了)。 –

+1

@Violet Giraffe:每次插入後都不需要調用'ensureIndex' - 它只需要在數據庫的生命週期中調用一次,就像使用MySQL一樣。另外,ObjectID並不是一個真正的'巨大'字段。不過,我同意使用散列是有道理的。在散列與對象id與guid的討論中,請確保您理解一致性和潛在分片鍵的長期影響。 – mnemosyn

相關問題