一个沉重的查询mongodb挂起网站

我的网站(使用MEAN.JS)有1个login页面,它也有多个统计页面(在db中的数据build立报告页面)。

有一个重要的报告会从数据库中提取大约100MB,花费大约10s来完成。 问题是运行这个报告时,大部分的其他网页都无法在浏览器上加载,因为它们也对MongoDB进行查询。 例如,即使已经显示login页面的UI,用户也不能loginlogin页面。

MongoDB能够并行执行多个查询吗?还是仅仅是一个查询队列?

MongoDB服务器版本是v3.2.3。 该报告使用2个集合:用户,trackinglocations。 我正在build设一个月的报告:

30 days * 100 users * 10000 gps locations/day/user = 30 million locations user: { username: (string), organization: (objectid) } trackinglocation: { username: (string), date: (date), locations: [ { speed: (number), long: (number), lat: (number) } ] } 

我首先查询,findpipe理组织中的用户。 然后查询报告该组织中用户在date范围内的旅行距离。

不仅login页面,许多其他页面在做报告时都不响应浏览器(UI部分仍然由ExpressJS响应,但没有数据表的机会)。

这种情况并不是mongodb所独有的。 是的,它可以并行运行查询,但即使其他数据库系统具有更好的并行性,如果启动特别大的报告,也会停止运行。

减轻这种情况的常用方法是在辅助/从属设备上运行繁重的查询(报告等)。 这样,主/主不受影响,并保持服务写和轻读。

另一种解决方法是从db中多次读取数据,每次读取一小段文件,然后在每次读取操作后稍作rest。

 //some lines below are pseudocode function getLocs(callback) { var idList = ...; var index = 0; var maxRead = 1000; var results = []; (function readATrunk(){ TrackingLocation.find({ id: { $in: idList[index]...idList[min(index+maxRead,idList.length-1)] } }). exec(function(error,trunk){ results = results.concat(trunk); if (index+maxRead<idList.length) { index += maxRead; //give a spare 1 second for other queries in //other web pages setTimeout(readATrunk,1000); } else { callback(results); } }); })(); }