2017-09-09 144 views
1

我已经在我的计算机上安装了几天前的MongoDB,为一项工作做了一些测试,详细地说,我们必须将大量数据从基于Postgres的系统转移到MongoDB之一。 因为我们不知道MongoDB(我们第一次使用它),我们试图研究文档,并且我们在少数数据库上做了一些测试,只用很少的数据来测试性能...... 经过很多测试,在这个时候我们仍然一个恶化... 但是现在我会解释上下文,所以也许有人可以告诉我,如果我们做错了或不是。 我们知道哪些是更多的“有问题”的疑问,我将在这里写下他们中的一个,在Postgres的查询是这样的(我会削减不必要的):MongoDB优化汇总

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个数据... 而就在这里,分别有1000个(站)和6400(measurement_daily)记录/文档的两个表,我们有3,5-4s(Postgres)vs 30-32s(MongoDB)作为响应时间... (为了测试两个系统的性能,查询重复了200次(这就是为什么我们有3,5-4s和30 -32s分别为一个查询)有一个“同质化”的响应时间,以尽量减少外因条件。) 任何帮助,非常感谢......

回答

2

根据mongoDB documentation当$开卷紧跟另一个$查找,并$ unwind在$ lookup的as字段上运行,优化器可以合并$ unwind进入$查找阶段。这避免了创建大型中间文件。

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

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