2015-03-03 75 views
0

我需要存儲用戶擁有的物品。MongoDb結構推薦

我目前使用如下的結構:

... 
inventory:{ 
    itemId1:2, 
    myOtherItem:120, 
    something:1 
}, 
... 

我正在考慮轉換到結構,如:

... 
inventory:[ 
    {id:"itemId1",amount:2}, 
    {id:"myOtherItem",amount:120}, 
    {id:"something",amount:1} 
], 
... 

是第二種方式的推薦方式來存儲數據?如果是這樣,第一種方式有什麼優勢嗎?

內存存儲空間有限。會採用第二種方式佔用更多的存儲空間嗎? MongoDb是否爲數組中的每個元素存儲「id」和「amount」?

回答

1

是的,是和是的簡短答案。是的,改變它。原因有很多。

第一點,總庫存:

db.collection.aggregate([ 
    { "$unwind": "$inventory" }, 
    { "$group": { 
     "_id": "$inventory.id", 
     "amount": { "$sum": "$amount" } 
    }} 
]) 

或跨文檔。因爲任何服務器處理都需要執行JavaScript,所以效率不高,因此很難處理現有的結構。

二,找一個文檔,其中的你的「庫存」項目之一的你有什麼,或在第二個表比10痛苦的JavaScript的處理更多的量沒有索引:

db.collection.find({ "inventory.amount": { "$gt": 10 } }) 

威爾它佔用更多的空間,是的,它將需要「小」更多的空間來存儲,但好處大於此。擔心的確沒有太大區別。

這是一種更好和更一致的方式,可以將事物和地圖始終存儲到代碼中的任何對象,而無需依賴特定字段的「散列/地圖」密鑰存儲區。

因此,它與各種MongoDB方法「玩得很開心」,並允許索引事物,因此建議使用它。是的,有這樣的優勢。正如俗話所說「沒有東西是免費的」,所以會有存儲影響,但幾乎可以忽略不計。但這是更好選擇的代價。