我需要存储用户拥有的项目。
我目前使用的结构如下:
...
inventory:{
itemId1:2,
myOtherItem:120,
something:1
},
...
我正在考虑转换到如下结构:
...
inventory:[
{id:"itemId1",amount:2},
{id:"myOtherItem",amount:120},
{id:"something",amount:1}
],
...
第二种方式是推荐的数据存储方式吗?如果是这样,第一种方式是否有任何优势?
内存存储空间有限。将使用第二种方式需要更多存储? MongoDb存储" id"和"金额"对于数组中的每个元素?
答案 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方法“玩得很好”并允许对事件进行索引,然后是的,建议使用它。是的,有上述优点。是的,因为俗话说“没有什么是免费的”,所以会有存储影响,但几乎可以忽略不计。但这是更好选择的代价。