从MongoDB查询每个关联一个文档
我正在调查MongoDB将如何为我们工作。最常用的查询之一用于获取每个站点的最新或给定时间测量值。有数千个观测站,每个观测站有数万次测量 因此,我们计划一次收集台站数据,另一次收集测量数据 在SQL中,我们将使用从MongoDB查询每个关联一个文档,mongodb,greatest-n-per-group,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' G
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
这将为每个站点返回一个测量值,并且该测量值是“时间到查询”之前的最新测量值
MongoDB中应该使用什么查询来产生相同的结果?我们确实在使用Rails和MongoId,但这并不重要
更新:
这个问题不是关于如何在MongoDB中执行连接。在SQL中,从表中获取正确的数据需要一个连接,这并不意味着在MongoDB中我们也需要一个连接。查询中只使用了一个表。我想最坏情况下的解决方案应该是这样的:
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
这取决于查询所需的时间。无论如何,数据都应该按照站点id和测量时间进行索引
SQL查询需要多少时间?我们提出了这个查询
db.measurements.aggregate([{$group:{ _id:{'station_id':"$station_id"}, time:{$max:'$meas_time'}}}]);
带索引
db.measurements.createIndex({ station_id: 1, meas_time: -1 });
尽管它似乎给出了正确的数据,但速度确实很慢。从6500万个文档集中获取3000多个文档大约需要一分钟的时间
刚发现MongoDB在这个查询中没有使用索引,即使我们使用的是3.2版本。MongoDB不支持JOIN。可能的重复我不认为这是JOIN问题的重复。在SQL中,这个查询需要连接并不意味着在MongoDB中它需要连接。到目前为止,每个集合的mongo文档示例有哪些?你试过什么了吗?否则,这个问题就成了“现在就把密码给我!”我说过,我们正在调查。这个查询被认为是MongoDB的一个潜在挑战,所以我想问一下其他人对此问题找到了什么解决方案。它本身的问题是相当普遍的。这将进行数千次查询。如果一个查询需要10毫秒,那么查询时间将达到几十秒。我们需要更快的速度。目前数据被分为多个表,每个月一个,因此我们没有一个好的SQL查询时间基准。停止使用签名。