2013-01-13 59 views
2

如何將mongodb ID縮短爲更容易解析用於URL的語法。字符串在當前迭代中太長了。在javascript中縮短MongoDB ID

Base64是體面的,但仍然太長。我正在尋找更多的小於7個字符的範圍。

我希望能夠在node.js和瀏覽器中對它進行編碼/解碼。

+1

http://stackoverflow.com/questions/1352671/unique-ids -with-mongodb – user956584

+0

這涉及到更改mongodb id字段。我不想這樣做。 – switz

+0

mongodb_id => machine_id [...] http://docs.mongodb.org/manual/core/object-id/ eq。刪除機器ID。或者使用一些簡短的散列函數crc32 [可能的衝突] – user956584

回答

3

解析來自請求的ObjectId並不困難(所以我不知道爲什麼這是一個問題?)。如果目標是製作可鍵入的網址,那麼擁有更短和更「友好」的網址將非常有價值。

你不能採取一個12字節的數字,在分片MongoDB設置中保證是唯一的,並將其壓縮到少於12字節,並保證它是唯一的(例如,你提到了7個字符)。

docs,所述的MongoDB的ObjectId組成:

  • 一個4字節的時間戳
  • 一個3字節的機器標識符
  • 的2字節的進程id
  • 和3-字節計數器。

因此,您需要犧牲ObjectId的某些部分(因此需要分片),或者設計一個索引的替代Id創建格式。

儘管您可能會對該ID進行散列,但可能會出現需要進行編碼的衝突(再次,您不能將12個字節降至4個字節並保證唯一性)。如果有可能發生衝突(並且會減少可用位的總數),那麼無論如何你需要某種輔助表(並且你需要創建一個從生成的ID到ObjectId的索引) 。

得到的選項:

  • 刪除正常顯著位 - 如果你這樣做,分片收集
  • 設計你自己的自己的獨特的ID解決方案(如果它是在一個網頁 - 它可能最終看起來非常類似於MongoDB的處理唯一性)
  • 使用ObjectId作爲一個長數字,並運行一個縮短的算法(它需要首先分解成更小的塊,因爲它超過了JavaScript的數字精度爲53位),請嘗試此算法,例如= encode它(最終會有17個字符左右)
  • 使用別的更短但唯一的文件編號爲
  • 最簡單:只需接受Ids很長。 :)

(目前尚不清楚爲什麼瀏覽器需要做這種轉換 - 爲什麼會在文檔的ObjectID?)

+0

我正在運行在服務器和客戶機上運行的代碼(http:// derbyjs。 COM)。感謝您的信息,我會自己制定一個自定義ID。 – switz