2013-06-28 26 views
0

我想將數百萬個條目存儲到mongob數據庫中。現在,我將對device_id(這是一個類似aaff33raf-22daa-333fa的字符串)的查詢進行大部分查詢。現在,將對象保留爲主鍵(_id)的對象並不是一個好主意。如何將該字符串映射到一個數字並將其存儲到數據庫中。如何在MongoDb中爲_id保留數據類型?

所以我的問題是 - 從可伸縮性的角度來看(很多讀取和大量的寫入)我應該如何保持我的_id字段?整數或字符串?

+0

一個整數_may_保存你的查詢時間,但一個可讀的字符串可以使任何可能的方便調試。我可以想象一下,當編碼爲數據庫中的一個整數時,試圖手動查找記錄'aaff33raf-22daa-333fa': -/ –

+0

爲什麼你認爲將它保持爲該格式的字符串是一個壞主意? – Philipp

回答

1

無論你選擇一個整數還是一個字符串作爲_id字段都沒有太大的區別。這是一個索引字段,所以通過_id拉出或通過_id更新並不會完全不同。

也許存儲值的大小是一個問題,但是_id可能與整個文檔相比很小...所以也可能不是問題。

然而,重要的是可讀性和調試性,如果你總是提到像「aaff33raf-22daa-333fa」這樣的產品,那麼你應該繼續這樣做。讓它在數據庫中一樣,讓你保持清醒。

0

如果您的設備ID是不可變的,那麼我將使用設備ID作爲文檔_id。如果設備ID可能會改變,並且您將文檔引用到文檔引用(如外鍵),那麼我會使用ObjectId s並使用設備ID創建二級索引。

最重要的是,如果您可以將設備ID轉換爲數字,請確保轉換沒有損失。

儘管您提供的示例顯然不是一個有效的數字(它包含字母r),但如果這是一個拼寫錯誤並且表示設備ID的另一個字符,那麼存儲設備ID所需的總字節數似乎超過8個字節)。

例如,這超過了在BSON中指定的Int64數值類型)。 (一個double也只能存儲8個字節)。

鑑於此,字符串是一個更合理(和安全)的密鑰,可用作文檔ID。性能差異與使用數字的差異很小。它們都將被編入索引,並且在搜索數字索引時可能會稍微快一些(以納秒爲單位),但在典型的工作流程中應該沒有關係。

此外,在早期應用程序構建期間,訪問MongoDB外殼通常很有用,其中DeviceID作爲字符串我想會比以編碼格式存儲更方便。 (db.devices.find({_id: 'aaff33raf-22daa-333fa' }))。