2015-03-03 124 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方法“玩得很开心”,并允许索引事物,因此建议使用它。是的,有这样的优势。正如俗话所说“没有东西是免费的”,所以会有存储影响,但几乎可以忽略不计。但这是更好选择的代价。