我正在构建一个应用程序,我有一个包含500多种产品的标准集合。该公司不断进行销售,因此在任何一个点上,将有2-10种产品在售。
我仍然试图围绕如何在Mongo中建模,但我正试图在“模型将如何访问数据”的风格中思考。由于产品页面的访问频率高于其他任何内容,我正在考虑将销售信息直接添加到产品系列中。像这样:
{
_id: 1,
name: "Widget",
price: 15.99,
...
sale: {
reducedPrice: 9.99
saleStarts: "Nov 11, 2016",
saleEnds: "Nov 18, 2016",
}
}
我有一个页面,其中列出了所有当前销售。它不经常访问,但它需要存在。我的问题是关于该查询中的性能,因为我不想在每次加载该页面时浏览每个产品,并且我试图避免通过第二个Sales集合来复制信息。
据我了解,当Mongo通过收藏品时,如果我正在寻找这样的东西:
Products.find({ sale: { $exists: true } })
它并没有真正涵盖所有记录。因此,如果我在销售结束时取消“销售”并将该字段保留在当前正在销售的记录中,那么表现应该不会太糟糕。
我的问题是:我在这里遗漏了什么吗?有没有更好的方法呢?
答案 0 :(得分:1)
MongoDB和许多其他数据库的工作方式是,您需要在要以合理性能查询的字段上使用索引。数据库中的索引保存在内存中,这意味着针对索引字段的查询不需要扫描硬盘驱动器,而是在内存中以高效到遍历的数据结构进行扫描,从而获得更好的性能。还有许多其他细节,我不需要进入,谷歌将很好地解释。
您可以阅读有关indexes on MongoDB's docs的更多信息,但要真正回答您的问题;如果您的集合中的sale
字段没有索引,MongoDB将被强制从磁盘扫描该集合中的所有文档(尽管有些文件可以缓存在内存中)。
您必须找到服务器可以容纳多少索引的最佳位置,以及不像其他集合那样经常访问的集合的权衡索引。您拥有的索引越多,mongod
守护程序将占用的RAM就越多。