从MongoDB查询每个关联的一个文档

时间:2015-11-26 10:25:23

标签: mongodb greatest-n-per-group

我正在调查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中我们还需要一个连接。查询中只使用了一个表。

2 个答案:

答案 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也没有在此查询中使用索引。