我有一个非常大的集合,每周有大约800万条记录,我需要分析它们以查找相关项目并编制报告。
日志对象
_id:
user_id: int
created_date: date
created_at: datetime
event_id: string
market_data: dict
我需要在一天内找到属于用户的所有对象,并找到与每个具有相同event_id的对象相关且在+/- 5秒的范围内,比较它们的market_data。
示例代码:
var matched_selection = [];
db.selection.find({user_id: _main_id_, date: _date_}).forEach(
function(main_selection){
db.selection.find({
user_id: {$ne: _main_id_},
event_id: main_selection.event_id,
created_at: {
$gte: main_selection.created_at-5000,
$lte: main_selection.created_at+5000
}
}).foreach(
function(sub_selection){
// compare main_selection.market_data to sub_selection.market_data
// and put result to matched_selection array
}
)
})
过去我在客户端查询和比较。但由于客户端和服务器之间传输了大量数据,性能非常糟糕。
目前我编写了一个服务器端javascript来比较数据,只返回结果 - 显然更快 - 但服务器端javascript很快就会被弃用。
现在我尝试使用map / reduce,但不允许在地图函数中使用子查询(找到sub_selection的那个)。
在我的案例中,最好的方法是什么?