MongoDB,Mongoose - 获取10k +文档时查询速度慢

时间:2015-10-13 13:35:42

标签: node.js mongodb mongoose

我有一个包含10-12k文档的MongoDB数据库,在尝试获取所有文档时遇到了非常慢的查询,如下所示:

Sales.find()
    .where('author').equals(author)
    .where('date').gt(startDate.unix()).lt(endDate.unix())
    .exec(function(err, results) {
        callback();
    });

此查询提取大约10.5k文档,执行时需要1000-1300ms。我尝试删除"其中"条件 - 它只会使它变慢(获取更多文档?)。

问题是来自Mongoose,MongoDB,JavaScript还是Node?我以前运行PHP / MySQL数据库,在类似条件下速度提高10-20倍,比如获取10k +行数据。我做错了什么?

修改

销售模式:

var salesSchema = new Schema({
    author: String,
    kind: String,
    productID: String,
    description: String,
    date: String,
    amount: String,
    transactionID: {
        type: String,
        unique : true
    }
});

从RoboMongo桌面客户端查询结果:

db.getCollection('sales').find({}).explain()

executionTimeMillis: 46
nReturned: 10359

1 个答案:

答案 0 :(得分:7)

问题来自猫鼬。默认情况下,find()会将文档作为Mongoose Documents返回,这会花费很多。通过向查询添加lean(),文档作为纯JavaScript对象返回,对于10k +返回文档的情况,查询时间减少了3-5次

Sales.find()
    .where('author').equals(author)
    .where('date').gt(startDate.unix()).lt(endDate.unix())
    .lean()
    .exec(function(err, results) {
        callback();
    });

在这里阅读更多内容: http://www.tothenew.com/blog/high-performance-find-query-using-lean-in-mongoose-2/