我在我的文檔中有一個類型爲int
的獨特ID字段。我在這個字段上做ensureIndex
,但我的文檔仍然包含_id
。我可以擺脫它嗎?MongoDB:是否可以避免使用自動_id字段?
回答
從docs ...
如果用戶試圖插入文檔,而無需提供_id場, 數據庫會自動生成一個對象ID並將其存儲 的_id領域。
但是,在您自己的值賦給_id ...
的_id值可以是任何類型的,比其他數組的,所以只要是 獨具一格。
更好的問題是,爲什麼你會創建自己的獨特的ID,就可以建立索引並刪除了非常有用的對象ID _id被自動索引?
所有官方車手使用對象ID,它有很多真正好的方面是:
它有一個時間戳內置的(所以你並不需要保存在日期字段 您文件,您可以使用它來按日期排序)。
它是一個「全局的,統一增加的序列號」---即 如果您需要分割您的數據,它仍然是唯一的跨服務器, 等
不,你不能擺脫它,it is there by design,但你可以映射你的唯一標識符int
到_id
本身插入文件時。
一個好主意是將你的散列存儲到_id字段中。
因此,數據庫不會自動創建_id字段,因爲它已經存在,您將保存未使用索引的空間。
只需將_id字段設置爲所需的值(例如您的散列)。但要小心,它需要是獨一無二的!
爲了確保唯一性,你要麼使其獨特或放一個子文檔的_id領域: {_id:{H:[yourHash],U:唯一標識符]},...}
這正是我所做的,一槍殺死兩隻鳥:我的文檔不包含龐大的ObjectID,每次插入後我都不需要調用'ensureIndex' - 我得到了顯着的加速(我永遠不會想'ensureIndex '太慢了)。 –
@Violet Giraffe:每次插入後都不需要調用'ensureIndex' - 它只需要在數據庫的生命週期中調用一次,就像使用MySQL一樣。另外,ObjectID並不是一個真正的'巨大'字段。不過,我同意使用散列是有道理的。在散列與對象id與guid的討論中,請確保您理解一致性和潛在分片鍵的長期影響。 – mnemosyn
- 1. MongoDB _id字段自動生成?
- 2. 是否可以物理地重組mongoDB集合以避免使用sort()?
- 3. 是否可以像MongoDB中的數字那樣生成'_id'?
- 4. 是mongoid自動索引字段_id嗎?
- 5. mongoose(mongodb)別名_id字段
- 6. mongo的組聚合後,是否可以重命名_id字段?
- 7. 具體示例:是否可以避免使用全局變量?
- 8. 是否可以使用安全令牌來避免下載
- 9. 是否可以避免使用Rails 3加載action_controller?
- 10. 是否可以避免使用double for循環
- 11. MongoDB無法$設置特定字段;自動_id字段在末尾
- 12. mongodb upsert是否使用查詢字段
- 13. 可以在MongoDB(Mongoose)上下文外使用MongoDB _id嗎?
- 14. 本地生成ID以避免由mongodb自動創建
- 15. 是否可以在報告中使用自定義字段
- 16. 使用MongoDB _id字段作爲具有多個字段的複合字段
- 17. Mongodb查詢,避免重複項目與不同_id
- 18. 避免使用組中的字段
- 19. 是否可以使用用戶信息自動完成Sharepoint中的字段?
- 20. 我可以自動填充MongoDB中的LastUpdated字段(使用C#驅動程序)
- 21. 避免/禁用自動跳轉到輸入字段
- 22. 更新MongoDB中的_id字段
- 23. 通過MongoDB中的_id字段查詢
- 24. 帶有持久性mongodb的_id字段
- 25. Mongodb插入doc沒有_id字段
- 26. C# - SQL-是否可以使用動態數組字段?
- 27. 避免自動回
- 28. 此代碼是否可以改進以避免重複?
- 29. 是否可以更改此代碼以避免使用C++ lambda表達式?
- 30. 這裏可以避免使用CURSOR嗎?
謝謝您!我是MongoDB的新手,我錯過了你引用的那部分文檔。並感謝您解釋使用ObjectID的好處。不過,我想使用我的ID,因爲它是一個散列(而且我需要將它存儲在我的文檔中),並且它比ObjectID小。 –
很高興爲您提供幫助,顯然它關於什麼最適合您的應用程序,但是我發現ObjectID在很多我第一次開始時就不會想到的情況下非常有用。玩得開心,http://learnmongo.com可能對你也有幫助! –
感謝您的好鏈接! –