我通过mongo shell使用mongodb来查询大型集合。由于某种原因,90秒后mongo shell似乎停止了我的查询并且没有返回任何内容。
我已经尝试了以下两个命令,但都不会返回任何内容。 90秒后它只给我一个新行,我可以输入另一个命令。
db.cards.find("现场":"东西&#34)maxTimeMS(9999999)。 db.cards.find("现场":"东西&#34)。addOption(DBQuery.Option.tailable)
db.cards.find()返回结果,但是任何带有参数的内容都会在90秒内超时,并且不会返回任何内容。
非常感谢任何帮助。
答案 0 :(得分:2)
鉴于问题的详细程度,我将专注于“查询大型集合”并猜测您正在使用MMAPv1存储引擎,而您的查询没有索引覆盖。
你是否受磁盘约束?
鉴于上述假设,您可以在RAM和磁盘之间循环数据。 Mongo有一个默认的100MB RAM限制,所以如果你的查询必须检查很多文件(没有索引覆盖),从磁盘到RAM的分页数据可能是罪魁祸首。我听说过mongo shell在你超出内存限制时描述或锁定/终止。
32位系统也可能对大型集合施加严格的内存限制。
您可以查看特定于操作系统的磁盘活动监视器,以了解这是否是您的问题。
你的收藏有多大?
接下来,你的收藏有多大?您可以show collections
查看集合的实际大小,也可以db.cards.count()
查看您的记录数。这有助于量化“大集合”。
注意:您可能需要使用mongo-hacker扩展来查看show collection中的集合磁盘。
Mongo shell调查
在mongo shell中,你还有几个值得一看的地方。 默认情况下,mongo将记录慢速查询(> 100ms)。 90秒超时后:
db.adminCommand({getLog: "global" })
并查找慢查询日志条目。
接下来查看您的获胜查询计划。
var e = db.cards.explain()
e.find("Field":"Something")
我猜你会看到
"stage": "COLLSCAN",
这意味着您正在进行完整的集合扫描,并且您需要索引覆盖率(查询和排序的好主意)。
<强>建议强>
您应该至少对任何生产查询具有部分索引覆盖率。正确的索引应该可以解决您的问题(假设您没有文件&gt; 16MB)。
另一种方法(我不建议 - 索引更好)是使用游标
var cursor = db.cards.find("Field":"Something")
while (cursor.hasNext()) {
print(tojson(cursor.next()));
}
根据根本原因,这可能适合您。