我是否将唯一的项目存储为对象或数组?
我正在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);
或者,也许你想确保每个项目有一个独特的名字。 在第二种情况下添加一个索引要容易得多(我认为其他一些答案也提到了这个问题)。
一般来说,一个好的策略是在你有一些东西(比如项目)的集合时使用数组,并使用具有属性的属性的对象。