我正在设计一个小型在线商店应用程序并使用MongoDB,我有一个应该包含项目的订单表。
每个项目都有一个唯一的属性code
。
我是否将数据库中的项目存储为对象,这使搜索变得非常简单:items[code]
items : {
"AR2" : { quantity : 50 },
"LS569" : { quantity : 30 },
}
或者我将其存储为数组(并使用循环搜索项目):
items : [
{ code : "AR2", quantity : 50 },
{ code : "LS569", quantity : 30 }
]
从数据库中检索数据时,哪种方法更好,以及每种方法可能存在哪些缺点和优势?
答案 0 :(得分:1)
这是第一个例子的基本问题。如果要查找包含“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操作更有效地处理数据。
答案 1 :(得分:0)
这取决于。您确定没有两个项目具有相同的代码吗?在这种情况下,您可能会使用第一个使用对象的选项。我不认为性能差异会那么显着。
如果您使用第一个示例,则可以输入item = items[code]
来访问具有特定代码的项目。
但是,假设您要添加一个名为“name”的字段,并查找具有特定名称的项目。在第一种情况下,这将是棘手的,但在第二种情况下,它是一个简单的var item = items.where(name: name);
或者您可能希望确保每个项目都有唯一的名称。在第二种情况下添加索引要容易得多(我认为其他一些答案已经讨论了这一点)。
一般来说,一个好的策略是在你拥有集合的东西(比如项目)时使用数组,并使用具有属性的对象,以及良好的属性。