Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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

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,Mongoose-获取10k+;文件_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js MongoDB,Mongoose-获取10k+;文件

Node.js MongoDB,Mongoose-获取10k+;文件,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个MongoDB数据库,集合中有10-12k个文档,在尝试获取所有文档时,我遇到了非常缓慢的查询,如下所示: Sales.find() .where('author').equals(author) .where('date').gt(startDate.unix()).lt(endDate.unix()) .exec(function(err, results) { callback(); }); 此查询获取大约10.5k个文档,执行需要

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

Sales.find()
    .where('author').equals(author)
    .where('date').gt(startDate.unix()).lt(endDate.unix())
    .exec(function(err, results) {
        callback();
    });
此查询获取大约10.5k个文档,执行需要1000-1300ms。我尝试删除“where”条件-这只会使它变慢(获取更多文档?)

问题是来自Mongoose、MongoDB、JavaScript还是节点?我曾经运行过PHP/MySQL数据库,在类似的情况下,它的运行速度是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

问题来自猫鼬。默认情况下,find()将以Mongoose文档的形式返回文档,这会花费很多。通过向查询中添加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();
    });
请在此处阅读更多信息:

您是否可以编辑您的问题,将
Sales
模型的架构定义、基础集合的任何索引、mongo shell
db.collection.find()方法的查询计划的输出与示例查询一起包括在内?是的,我会这样做,谢谢!我可以看到,
date
是一个字符串,但是您的mongoose
Sales.find()
方法正在基于一个unix时间戳字段执行日期范围查询,该字段是一个整数,而且看起来您没有在
date
字段上定义任何索引,因此mongodb可能正在执行完整的集合扫描。您还可以添加来自
db.getCollection('sales').find({author:author,date{gt:startDate,lt:endDate}})的输出吗?explain()
?我认为有些问题。“db.getCollection('sales').find({author:'nickys',date:{gt:'1325336400',lt:'1420030800'}。).explain()”不返回任何结果。我试着从时间戳中删除引号,但没用。如果我删除整个日期条件,它就会工作。请原谅,我是Mongo的新手:)我将阅读更多关于这些索引的信息,并在再次运行测试时更新帖子。谢谢谢谢你救了我一天!如果您有超过10万个文档,并且已经设置了lean(),但仍然需要很长时间,该怎么办?请与我们合作,从33000毫秒到5000毫秒,处理70k个文档