我几天前在我的电脑上安装了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 (station)和6400 (measurement_daily)记录/文档,我们有3.5-4s (Postgres)和30-32s (MongoDB)作为响应时间……(为了测试两个系统中的性能,查询重复200次(这就是为什么我们对一个查询分别使用3,5-4秒和30-32秒),以获得“同类”响应时间,从而最大限度地减少外部因素的影响。)任何帮助都是非常感谢的。
发布于 2017-11-05 23:22:05
根据mongoDB documentation的说法,当一个$unwind紧跟在另一个$lookup之后,并且$unwind在$lookup的as字段上操作时,优化器可以将$unwind合并到$lookup阶段。这避免了创建大的中间文档。
在您的示例中,它将如下所示:
"$lookup": {
"from":"station",
"localField":"station_id",
"foreignField":"_id",
"as": "scd"
unwinding: { preserveNullAndEmptyArrays: false }
}https://stackoverflow.com/questions/46134881
复制相似问题