MongoDb结构建议

时间:2015-03-03 03:50:31

标签: mongodb memory memory-management database

我需要存储用户拥有的项目。

我目前使用的结构如下:

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

我正在考虑转换到如下结构:

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

第二种方式是推荐的数据存储方式吗?如果是这样,第一种方式是否有任何优势?

内存存储空间有限。将使用第二种方式需要更多存储? MongoDb存储" id"和"金额"对于数组中的每个元素?

1 个答案:

答案 0 :(得分:1)

是,是和是简短的答案。是的,改变它。原因有很多。

第一点,总库存:

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

或跨文件。使用现有结构很痛苦,因为任何服务器处理都需要执行效率不高的JavaScript。

其次,查找一个文档,其中一个“库存”项目的金额超过10.痛苦的JavaScript处理没有您拥有的索引,或者简单的第二种形式:

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

是否会占用更多空间,是的,它需要一点“更多”存储空间,但好处超过了这一点。担心的确不是那么多。

这是一种更好,更一致的方法,可以将内容和地图一致地存储到代码中的任何对象,而不依赖于特定字段的“哈希/地图”密钥存储。

因为它与各种MongoDB方法“玩得很好”并允许对事件进行索引,然后是的,建议使用它。是的,有上述优点。是的,因为俗话说“没有什么是免费的”,所以会有存储影响,但几乎可以忽略不计。但这是更好选择的代价。