Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Javascript 检索大量文档时MongoDB速度非常慢(node+;mongoose+;express)_Javascript_Node.js_Mongodb_Mongoose_Mean Stack - Fatal编程技术网

Javascript 检索大量文档时MongoDB速度非常慢(node+;mongoose+;express)

Javascript 检索大量文档时MongoDB速度非常慢(node+;mongoose+;express),javascript,node.js,mongodb,mongoose,mean-stack,Javascript,Node.js,Mongodb,Mongoose,Mean Stack,我的express应用程序需要列出我目前在mongo数据库中的用户数。当我要求少量用户(即约100个)时,这很好,但是如果我要求数万个用户,我开始看到响应时间的巨大延迟。例如,检索25000个用户大约需要19秒 在mongo中有这样的表现是正常的,还是我应该怀疑我在某处有bug 这是我的模型: 'use strict'; // External modules const mongoose = require('mongoose'); const encrypt = require('mong

我的express应用程序需要列出我目前在mongo数据库中的用户数。当我要求少量用户(即约100个)时,这很好,但是如果我要求数万个用户,我开始看到响应时间的巨大延迟。例如,检索25000个用户大约需要19秒

在mongo中有这样的表现是正常的,还是我应该怀疑我在某处有bug

这是我的模型:

'use strict';

// External modules
const mongoose = require('mongoose');
const encrypt = require('mongoose-encryption');

const Schema = mongoose.Schema;

const UserSchema = new Schema({
        uuid: {
            type: String,
            trim: true,
            // TODO: test for unique uuid
            index: { unique: true },
            required: 'uuid cannot be blank'
        },
        createdOn: {
            type: Date,
            default: Date.now,
            index: true
        },
        email: {
            type: String,
            trim: true,
            required: 'email cannot be blank'
        },
        lists: [{
            type: Schema.Types.ObjectId,
            ref: 'List'
        }]
    });

UserSchema.index({ "lists" : 1 , "createdOn" : 1});
UserSchema.plugin(encrypt, { encryptionKey: process.env.EMAIL_ENCRYPTION_KEY, signingKey: process.env.EMAIL_SIGNING_KEY, encryptedFields: ['email'] });

mongoose.model('User', UserSchema);
我的问题是:

exports.list = (req, res) => {

    let page = (Number(req.query.p) > 0 ? Number(req.query.p) : 1) - 1;
    let perPage = (Number(req.query.pp) > 0 ? Number(req.query.pp) : 100);

    res.header('X-Page', page + 1);
    res.header('X-Per-Page', perPage);

    User.count({}, (countErr, count) => {

        res.header('X-Total-Count', count);

        User.find({}, { __v: 0, createdOn: 0})
            .sort({'createdOn': 1})
            .limit(perPage)
            .skip(perPage * page)
            .exec((err, users) => {
                if (err) {
                    return res.status(400).send({
                        message: err
                    });
                }
                else {
                    res.json(users);
                }
            });

    });

};

分析时,
count()
操作大约需要52毫秒,因此,大部分时间都花在
find()
查询上。

阅读这篇@Skahrz,感谢您指出这一点。我认为我的查询要简单得多(加上我已经创建了{“list”:1,“createdOn”:1}索引,这是AFAIK查询中唯一使用的索引。那么您运行mongo的机器呢?@syymza Yea 5M有点多。您是否尝试过在没有Mongoose的情况下运行查询(排除Mongoose是瓶颈)?另外,尝试使用和/或。@robertklep哇,使用
lean
将性能提高了一个数量级!阅读这篇@Skahrz感谢您指出这一点。我认为我的查询要简单得多(另外我创建了{“列表”:1,“createdOn”:1}索引,这是AFAIK查询中唯一使用的一个。您运行mongo的机器呢?@syymza yeah 5M有点多。您是否尝试过在没有Mongoose的情况下运行查询(以排除Mongoose是瓶颈)?另外,尝试使用和/或。@robertklep哇,使用
lean
将性能提高了一个数量级!阅读这篇@Skahrz感谢您指出这一点。我认为我的查询要简单得多(另外我创建了{“列表”:1,“createdOn”:1}索引,这是AFAIK查询中唯一使用的一个。您运行mongo的机器呢?@syymza yeah 5M有点多。您是否尝试过在没有Mongoose的情况下运行查询(以排除Mongoose是瓶颈)?另外,尝试使用和/或。@robertklep Wow,使用
lean
将性能提高一个数量级!