Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Node.js 对mongodb的大量查询将网站挂起_Node.js_Mongodb_Performance_Nosql - Fatal编程技术网

Node.js 对mongodb的大量查询将网站挂起

Node.js 对mongodb的大量查询将网站挂起,node.js,mongodb,performance,nosql,Node.js,Mongodb,Performance,Nosql,我的网站(使用MEAN.JS)有一个登录页面,还有多个统计页面(基于数据库中的数据构建的报告页面) 有一份繁重的报告将从数据库中提取约100MB的数据,需要约10秒才能完成。问题是,当运行此报告时,大多数其他网页也无法在浏览器上加载,因为它们也向MongoDB进行查询。例如,即使登录页面的UI已经显示,用户也不能在登录页面上登录 MongoDB能够并行执行多个查询,还是只执行一个查询队列 MongoDB服务器版本为v3.2.3。报告使用2个集合:用户、跟踪位置。我正在制作一个月的报告: 30 d

我的网站(使用MEAN.JS)有一个登录页面,还有多个统计页面(基于数据库中的数据构建的报告页面)

有一份繁重的报告将从数据库中提取约100MB的数据,需要约10秒才能完成。问题是,当运行此报告时,大多数其他网页也无法在浏览器上加载,因为它们也向MongoDB进行查询。例如,即使登录页面的UI已经显示,用户也不能在登录页面上登录

MongoDB能够并行执行多个查询,还是只执行一个查询队列

MongoDB服务器版本为v3.2.3。报告使用2个集合:用户、跟踪位置。我正在制作一个月的报告:

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)
        }
    ]
}
我首先查询以查找管理员组织中的那些用户。然后查询以生成该组织中用户在某个日期范围内的旅行距离报告


在制作报告的10秒钟内,不仅登录页面,许多其他页面都不响应浏览器(UI部分仍然由ExpressJS响应,但其中的数据表没有机会响应)。

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


缓解这种情况的一种常见方法是在辅助/从属服务器上运行大量查询(报告等)。这样,主/主系统就不会受到影响,并继续提供写操作和较轻的读取操作。

除了从辅助系统读取之外,另一种解决方案是多次从数据库读取,每次读取一个较短的文档主干,然后在每次读取操作后稍作休息

//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);
            }
        });
    })();
}
//下面的一些行是伪代码
函数getLocs(回调){
var idList=。。。;
var指数=0;
var maxRead=1000;
var结果=[];
(函数readATrunk(){
TrackingLocation.find({
身份证:{
$in:idList[index]…idList[min(index+maxRead,idList.length-1)]
}
}).
exec(函数(错误,中继){
结果=结果。concat(主干);

如果(index+maxread您使用的mongo版本是什么?query在报表和用户登录时是否使用相同的集合?您使用的是什么类型的繁重查询?您使用的是什么存储引擎?所有这些都很重要。mongodb server v3.2.3版,报表使用了两个集合:用户、跟踪位置;这可能会干扰许多其他quries。我在中添加了更多信息问题