【问题标题】:MongoDB optimization aggregationMongoDB优化聚合
【发布时间】:2018-02-18 11:11:41
【问题描述】:

几天前我在我的计算机上安装了 MongoDB 来做一些测试工作,具体来说,我们必须将大量数据从基于 Postgres 的系统传输到 MongoDB 系统。 因为我们不了解 MongoDB(我们第一次使用它),所以我们尝试研究文档,并在一个带有少量数据的小数据库上进行了一些测试以测试性能...... 在这个时候经过多次测试,我们仍然有一个恶化...... 但是现在我将解释上下文,所以也许有人可以告诉我我们是否做错了什么。 我们知道哪些是更“有问题”的查询,我将在这里写其中一个,在 Postgres 中,查询是这样的(我将删除不必要的):

selectStmt varchar = 'SELECT station.radarmeteo_id,
  date(datetime_range) AS datetime_range,
  district.name AS district,
  city.name AS city,
  min_temperature::real / 10::real,
  max_temperature::real / 10::real,
  rainfall_daily::real / 10::real,
  max_wind_speed::real / 10::real,
  extract(epoch FROM datetime_range) as unix_datetime ';

fromStmt varchar = ' FROM measurement_daily
  INNER JOIN station ON measurement_daily.station_id = station.id;

在 MongoDB 中我们这样写:

db.measurement_daily.aggregate([{"$match":{"min_temperature":{"$gt":random.randint(-30, 14), "$lt":random.randint(18, 50)}}},{"$lookup":{"from":"station","localField":"station_id", "foreignField":"_id", "as": "scd"}},{"$unwind":"$scd"},{"$project":{"_id":1,"min_temperature":1,"max_temperature":1, "rainfall_daily":1, "max_wind_speed":1, "radarmeteo_id":"$scd.radarmeteo_id", "city_name":"$scd.city_name", "district_name":"$scd.district_name"}},{"$out":"result"}])

我在这里要问的是:它应该写得更好吗?还是有更好的方法来获得相同的结果?我们可以使用其他优化吗? 我们需要最好的响应时间,因为真正的数据库应该只有这个集合中的 200.000.000 个数据...... 就在这里,有 2 个表分别有 1000 个(站)和 6400 个(measurement_daily)记录/文档,我们有 3,5-4s(Postgres)和 30-32s(MongoDB)作为响应时间...... (为了测试两个系统中的性能,查询重复 200 次(这就是为什么我们分别为一个查询设置 3,5-4 秒和 30-32 秒的原因)以获得“均匀”的响应时间,以最大限度地减少外部原因造成的影响。) 任何帮助都非常感谢......

【问题讨论】:

    标签: mongodb optimization match lookup aggregation


    【解决方案1】:

    根据mongoDB documentation,当 $unwind 紧跟在另一个 $lookup 之后,并且 $unwind 在 $lookup 的 as 字段上运行时,优化器可以将 $unwind 合并到 $lookup 阶段。这样可以避免创建大型中间文档。

    在你的情况下,它看起来像:

    "$lookup": {
         "from":"station",
         "localField":"station_id", 
         "foreignField":"_id", 
         "as": "scd"
         unwinding: { preserveNullAndEmptyArrays: false }
     }
    

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 2013-01-18
      相关资源
      最近更新 更多