2011-08-29 84 views
0

考虑我在MongoDB中有两个集合。一个产品的文件,如:查询MongoDB最后的项目

{'_id': ObjectId('lalala'), 'title': 'Yellow banana'} 

,另一个类似的文件存储的价格变化:

{'product': DBRef('products', ObjectId('lalala')), 
'since': datetime(2011, 4, 5), 
'new_price': 150 } 

一个产品可以有多个价格的变化。价格持续到有新的更改并带有更新的时间戳。我想你已经发现了主意。

说,我有100个产品。我想查询我的数据库,以了解2011年6月9日那一刻每种产品的价格。在MongoDB中执行此查询的最有效(快速)方式是什么?假设我没有缓存解决方案或缓存为空。

我想到了关于prices集合的group声明,其中reduce函数会在提供日期之前选择最后的since,按product.$id分组。但在这种情况下,我不会受益于since字段上的索引,并且将扫描所有文档。

任何想法?

回答

1

我有一个类似的问题,但GPS位置。我发现最快的方法是为每个项目设置一个查询,如果您习惯使用SQL数据库,那么这非常不直观。

查询其时间戳的项目小于或等于您查找的日期,并将结果限制为1.对每个项目重复。要真正加快速度,可以并行运行多个查询来利用MongoDB服务器上的所有内核。

+0

嗯,我认为这是一个很大的否定。它真的具有可比性:100个查询有1个项目,1个查询有100个项目? – nkrkv

+0

我最初是为了团队选项而去的,而且速度非常慢。在同样的任务下比mySQL慢很多。我甚至没有想过要尝试为每个项目设置一个查询,直到Mongo邮件列表中的某个人建议它。令我惊讶的是它比mySQL更快。 – FlappySocks