我正在构建一个应用程序,我有一个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通过a集合时,如果我正在寻找这样的东西:
Products.find({ sale: { $exists: true } })
它并没有遍历所有的记录。因此,如果我在销售结束时取消设置"sale",只保留当前正在销售的记录中的字段,那么性能应该不会太差。
我的问题是:我错过了什么吗?有更好的方法吗?
MongoDB的工作方式,以及许多其他数据库,是你需要一个索引字段,你想以合理的性能查询。数据库中的索引保存在内存中,这意味着对索引字段的查询不需要对硬盘驱动器进行扫描,而是在内存中以有效的遍历数据结构进行扫描,从而产生更好的性能。还有很多其他的细节,我不需要进入,谷歌会解释得很好。
你可以在MongoDB的文档中阅读更多关于索引的信息,但要真正回答你的问题;如果你的集合中没有sale
字段的索引,MongoDB将被迫从磁盘扫描该集合中的所有文档(尽管有些可能缓存在内存中)。
您必须找到服务器可以容纳多少索引的最佳位置,并权衡不像其他集合那样经常访问的集合的索引。索引越多,mongod
守护进程消耗的内存就越多。