Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MongoDB查询每个关联一个文档_Mongodb_Greatest N Per Group - Fatal编程技术网

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

从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

我正在调查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
这将为每个站点返回一个测量值,并且该测量值是“时间到查询”之前的最新测量值

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查询时间基准。停止使用签名。