我的快递应用程序需要列出我目前在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()
查询上。