2013-08-18 99 views
2

我正在開發一個創建永久鏈接的應用程序。我不確定如何將文檔保存在MondoDB中。兩種策略:在MongoDB中生成_id與ObjectId自動生成

  1. 的ObjectId自動生成

    MongoDB的自動生成的_id。我需要在permalink字段上創建索引,因爲我通過固定鏈接獲取信息。另外,我可以使用getTimestamp()方法訪問ObjectId的創建時間,因此datetime字段似乎是多餘的,但如果我刪除此字段,則需要兩次調用MongoDB以獲取信息,另一個調用時間戳。

    { 
        "_id": ObjectId("5210a64f846cb004b5000001"), 
        "permalink": "ca8W7mc0ZUx43bxTuSGN", 
        "data": "a lot of stuff", 
        "datetime": ISODate("2013-08-18T11:47:43.460+-100") 
    } 
    
  2. 生成_id

    我產生_id與固定鏈接。

    { 
        "_id": "ca8W7mc0ZUx43bxTuSGN", 
        "data": "a lot of stuff", 
        "datetime": ISODate("2013-08-18T11:47:43.460+-100") 
    } 
    

我看不到任何優勢,使用的ObjectID。我錯過了什麼嗎?

+0

我沒有看到真正的問題?自動生成的_id在時間戳中有一些很好的信息,所以你不需要像目前正在做的那樣將日期時間存儲在一個單獨的字段中。順便說一下,_id是自動生成的,它保證了唯一性 – Dukeatcoding

回答

6

ObjectId有沒有爲集合中的每個文檔都沒有唯一鍵的情況。它們是獨一無二的,因此您不必擔心衝突,並且在大型部署中合理分散,而不必擔心(他們有優點和缺點,請閱讀here)。

ObjectId還包含生成ObjectId的客戶端的時間戳(除非DB服務器配置爲生成所有密鑰)。如您所見,您可以使用時間戳執行一些日期操作。但是,如果您打算使用聚合框架,則會發現當前的任何日期操作(issue)中都不能使用ObjectId。如果您想使用自動對焦,則需要第二個包含日期的字段,但不幸的是雙擊將其存儲爲ObjectId的內部值。

如果您確信您生成的_id是唯一的,那麼在您的數據結構中使用ObjectId沒有多少理由。