检索大量文档时非常慢的MongoDB(node + mongoose + express)

时间:2015-06-09 14:17:02

标签: javascript node.js mongodb mongoose mean-stack

我的快递应用程序需要列出我目前在mongo数据库中拥有的用户数。当我要求少量用户(即~100)时,这很好用,但如果我要求成千上万的数字,我开始看到响应时间的巨大延迟。例如,检索25,000个用户大约需要19秒。

在mongo中有这种表现是正常的,还是我怀疑我在某处有错误?

这是我的模特:

'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()查询上。

0 个答案:

没有答案