我正在调查MongoDB如何为我们工作。最常用的查询之一用于获取每个站的最新(或从给定时间)测量。有数千个站点,每个站点有数万个测量值。
因此,我们计划为车站设置一个集合,为测量设计另一个集合。
在SQL中,我们将使用
进行查询SELECT * FROM measurements
INNER JOIN (
SELECT max(meas_time) station_id
FROM measurements
WHERE meas_time <= 'time_to_query'
GROUP BY station_id
) t2 ON t2.station_id = measurements.station_id
AND t2.meas_time = measurements.meas_time
这将为每个工作站返回一个测量值,测量值是“time_to_query”之前的最新测量值。
在MongoDB中应该使用什么查询来产生相同的结果?我们实际上使用的是Rails和MongoId,但这并不重要。
更新 这个问题不是关于如何在MongoDB中执行JOIN。事实上,在SQL中从表中获取正确的数据需要连接并不一定意味着在MongoDB中我们还需要一个连接。查询中只使用了一个表。
答案 0 :(得分:0)
我猜最糟糕的情况解决方案就是这样(我的脑子里):
meassures = []
StationId.all.each do |station|
meassurement = Meassurment.where(station_id: station.id, meas_time <= 'time_to_query').order_by(meas_time: -1).limit(1)
meassures << [station.name, meassurement.measure, ....]
end
这取决于查询可以花多少时间。无论如何,数据应该由station_id和meas_time索引。
SQL查询需要多长时间?
答案 1 :(得分:0)
我们想出了这个查询
db.measurements.aggregate([{$group:{ _id:{'station_id':"$station_id"}, time:{$max:'$meas_time'}}}]);
带索引
db.measurements.createIndex({ station_id: 1, meas_time: -1 });
即使它似乎提供了正确的数据,但它确实很慢。需要大约一分钟才能从6500万集合中获得超过3000个文档。
刚发现即使我们使用3.2版本,MongoDB也没有在此查询中使用索引。