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

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

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

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

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

还是将它作为数组存储(并使用循环search项目):

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

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

这是第一个例子的基本问题。 如果你想find包含“AR2”的文件,那么你必须这样查询:

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

如果你只是想显示“AR2”的项目,那么你这样做:

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

所以Uck! 缺less一个更好的术语。

不能使用“索引”来加快search速度,因为MongoDB操作员无法以这种方式遍历文档密钥,所以无法以简单的方式在“AR2”或其他文档中聚合文档。

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

另外“数据作为关键字”对数据库不利。 你应该把“数据”作为“数据”,如第二个例子所示。

你可以在哪里使用索引:

 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操作。

这取决于。 你确定没有两个项目会有相同的代码? 在这种情况下,您可能会失去使用对象的第一个选项。 我不认为性能差异将是显着的。

如果使用第一个示例,则可以键入item = items[code]来访问具有特定代码的项目。

但是让我们假设你想添加一个叫'name'的字段,然后查找一个具有特定名字的项目。 在第一种情况下,这将是棘手的,但在第二种情况下,这是一个简单的var item = items.where(name: name);

或者,也许你想确保每个项目有一个独特的名字。 在第二种情况下添加一个索引要容易得多(我认为其他一些答案也提到了这个问题)。

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