【发布时间】:2016-01-11 06:58:21
【问题描述】:
我有一个 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-1300 毫秒。我尝试删除“where”条件 - 它只会让它变慢(获取更多文档?)。
问题是来自 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
【问题讨论】:
-
您能否编辑您的问题以包含
Sales模型的架构定义、基础集合上的任何索引、mongo shelldb.collection.find()方法的.explain()查询计划的输出示例查询? -
是的,我会这样做的,谢谢!
-
我可以看到
date是一个字符串,但你的猫鼬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 的新手 :)
-
当我再次运行测试时,我将阅读有关这些索引的更多信息并更新帖子。谢谢!