2011-03-09 68 views
0

我想在mongodb中存儲一個類似於哈希的值。我可以把許多密鑰放在一個mongodb集合中

有兩個收集,人員和工作。一個人有一些數量的作品。在其他館藏中加入更多細節(也許參考其他館藏)。

例如。人(吉姆)有一件作品(a)和三件作品(b)。

// Person 
{ 
    _id: "4d772583c186233352000001" 
    name: "Jim" 
    works: { 
     "4d772583c186233352000002": 1 
     "4d772583c186233352000003": 3 
     ... 
    } 
} 

// Work 
{ 
    _id: "4d772583c186233352000002" 
    title: "Make cake" 
    finished_at: ... 
} 
{ 
    _id: "4d772583c186233352000003" 
    title: "Make iPhone" 
    finished_at: ... 
} 
... 

如果我存儲像上面這樣的人的作品屬性。人員關鍵路徑將包括工作的ID並且一次又一次地增加。這是對的嗎?

+0

在Rich-Web項目中。我們需要序列化從服務器到客戶端的數據。第一個數據樣式將變成字典。否則,我們必須處理一個數組和一些字典。 – colder

回答

1

我不完全相信我理解這裏的實際問題。你是否要求對你的模式設計提出第二個意見?如果是這樣,這是我的:

使用文檔ID保持集合之間的關係絕對沒有錯,就像你所做的一樣。有時候,這是正確的(也是唯一的)方法,即使你必須承擔維護關係/參考的責任,因爲你可能知道,mongoDB不會幫助你。

雖然,通過查看上面的示例模式來理解您的用例有點困難,但是捕捉我眼睛的是工作對象。

我想你會更好使用數組 - 也許是這樣的:

works: [ 
     { "4d772583c186233352000002": 1 }, 
     { "4d772583c186233352000003": 3 } 
] 

這樣,你將有來自蒙戈更好的支持在維護你的參考,使用例如$拉動和$推運營商。

但是,我想知道如何使用外部id參考作爲工作參考對象中的關鍵。對於更多的慣用物體,請考慮:

works : [ 
    { work_id: "4d772583c186233352000002", quantity: 1 }, 
    { work_id: "4d772583c186233352000003", quantity: 3 } 
] 

這有幫助嗎?

+0

我擔心的關鍵是可變的。如果我有大量數據。 mongodb會減慢嗎?我無法想象如何爲他們建立索引。 – colder

+0

我不明白你的意思是關鍵是可變的。 很明顯,你輸入的數據越多,mongo就會越慢。但是在這之前你可以擁有大量的這些類型的文檔,除非你有非常明確的性能要求。只要確保你的查詢將使用你的索引。 關於索引,如果您的意思是您希望查詢擁有對特定工作的引用的Person,則可以通過在「works.works_id」,「db.persons.ensureIndex」上添加索引來輕鬆完成此操作({「works.works_id」:1})' – svjson

相關問題