我是否将唯一项目存储为对象或数组?

时间:2015-06-26 07:09:44

标签: javascript node.js mongodb

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

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

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

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

或者我将其存储为数组(并使用循环搜索项目):

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

从数据库中检索数据时,哪种方法更好,以及每种方法可能存在哪些缺点和优势?

2 个答案:

答案 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);

或者您可能希望确保每个项目都有唯一的名称。在第二种情况下添加索引要容易得多(我认为其他一些答案已经讨论了这一点)。

一般来说,一个好的策略是在你拥有集合的东西(比如项目)时使用数组,并使用具有属性的对象,以及良好的属性。

相关问题