【发布时间】:2014-05-24 12:23:29
【问题描述】:
我已经解决了这个问题,但正在寻找更好的方法在 mongodb 服务器而不是客户端上解决。
我有一组带有放置日期时间(iso 日期)和产品的订单。
{ _id:1, datetime:“T1”, product:”Apple”}
{ _id:2, datetime:“T2”, product:”Orange”}
{ _id:3, datetime:“T3”, product:”Pear”}
{ _id:4, datetime:“T4”, product:”Pear”}
{ _id:5, datetime:“T5”, product:”Apple”}
目标:在给定时间(或一组时间)显示该时间之前我的一组产品中每个产品的最后一个订单。产品是有限且已知的。
例如。查询时间 T6 将返回:
{ _id:2, datetime:“T2”, product:”Orange”}
{ _id:4, datetime:“T4”, product:”Pear”}
{ _id:5, datetime:“T5”, product:”Apple”}
T4 将返回:
{ _id:1, datetime:“T1”, product:”Apple”}
{ _id:2, datetime:“T2”, product:”Orange”}
{ _id:4, datetime:“T4”, product:”Pear”}
我通过在订单上创建复合索引来实现这一点 [datetime:descending, product:ascending] 然后在java客户端上:
findLastOrdersForTimes(times) {
for (time: times) {
for (product: products) {
db.orders.findOne(product:product, datetime: { $lt: time}}
}
}
}
现在速度非常快,因为它会命中索引并且只获取我需要的数据。但是我需要查询许多时间点(100000+),这将是网络上的很多呼叫。我的订单表也将非常大。那么我怎样才能在服务器上一键完成此操作,即返回时间->数组产品的集合?如果是 oracle,id 创建一个带有游标的存储过程,该游标会及时循环并收集每个时间点的结果,并在最后一个时间点之后到达最后一个产品时中断。我看过聚合框架和 mapreduce,但不知道如何实现这种循环。有什么指点吗?
【问题讨论】:
标签: mongodb mapreduce aggregation-framework