I have a MongoDB database with 10-12k documents in a collection and I'm experiencing really slow queries when attempting to fetch all documents, like this:
Sales.find()
.where('author').equals(author)
.where('date').gt(startDate.unix()).lt(endDate.unix())
.exec(function(err, results) {
callback();
});
This query fetches around 10.5k documents and it takes 1000-1300ms to execute. I tried removing the "where" conditions - it only makes it slower (more documents fetched?).
Does the problem come from Mongoose, MongoDB, JavaScript or Node? I used to run PHP/MySQL database and it was 10-20 times faster in similar conditions, like fetching 10k+ rows of data. What am I doing wrong?
EDIT
Sales schema:
var salesSchema = new Schema({
author: String,
kind: String,
productID: String,
description: String,
date: String,
amount: String,
transactionID: {
type: String,
unique : true
}
});
Query result from the RoboMongo desktop client:
db.getCollection('sales').find({}).explain()
executionTimeMillis: 46
nReturned: 10359
Sales
model, any indexes on the underlying collection, output from the.explain()
query plan for the mongo shelldb.collection.find()
method with the sample query? – chridamdate
is a String but your mongooseSales.find()
method is doing a date range query based on a unix timestamp field which is an integer, also it looks like you don't have any indexes defined on thedate
field so there might be a possibility that mongodb is doing a full collection scan. Can you also add the output fromdb.getCollection('sales').find({author: author, date {gt: startDate, lt: endDate }}).explain()
? – chridam