Closed. This question is opinion-based。它当前不接受答案。
                        
                    
                
            
        
            
        
                
                    
                
            
                
                    想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                
                    4年前关闭。
            
        

    

我正在设计一个小型的在线商店应用程序,并使用MongoDB,那里有一个应该包含商品的订单表。

每个项目都有一个唯一的属性code

我是否将项目作为对象存储在数据库中,这使得搜索非常简单:items[code]

items : {
  "AR2"   : { quantity : 50 },
  "LS569" : { quantity : 30 },
}


还是将其存储为数组(并使用循环搜索项):

items : [
  { code : "AR2",   quantity : 50 },
  { code : "LS569", quantity : 30 }
]


从数据库检索数据时,哪个更好,每种方法可能有哪些缺点和优点?

最佳答案

这是第一个示例的基本问题。如果要查找包含“ AR2”的文档,则必须这样查询:

db.collection.find({ "items.AR2": { "$exists": true }})


如果您只想显示“ AR2”项目,则可以执行以下操作:

db.collection.find({ "items.AR2": { "$exists": true }},{ "items.AR2": 1 })


哎呀!缺乏更好的条件。

您不能使用“索引”来加快搜索的速度,也不能以简单的方式在文档中汇总“ AR2”或其他文档,因为MongoDB操作员无法以这种方式遍历文档的键。

用这种结构做有用的事情通常意味着使用JavaScript方法进行编码,并在集合中进行“蛮力”匹配。所有这些都是不好的。

同样,“数据作为键名”对数据库不利。如第二个示例所示,您应该将“数据”作为“数据”。

可以使用索引的位置:

db.collection.ensuteIndex({ "items.code": 1 })

db.collection.find({ "items.code": "AR2" })


快。

您还可以非常轻松快捷地添加所有“ AR2”:

db.collection.aggregate([
    { "$match": { "items.code": "AR2" } },
    { "$unwind": "$items" },
    { "$match": { "items.code": "AR2" } },
    { "$group": { "_id": null, "sum": { "$sum": "$items.quantity" } }
])


因此,索引本机处理功能可以比其他所需的其他JavaScript操作更有效地处理数据。

关于javascript - 我是否将唯一项存储为对象或数组? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31067071/

10-11 06:41