MongoDB:尝试解释查询在排序内存限制上失败

MongoDB:尝试解释查询在排序内存限制上失败,mongodb,Mongodb,我在某些查询中遇到“排序操作使用的内存超过最大33554432字节”错误。然而更麻烦的是,我甚至不能用运行它。explain(): 试图重新创建索引,但没有更改 这里会发生什么 编辑:为了澄清,排序字段已编制索引,并按正确的排序顺序排列。我想知道为什么解释失败了,这对我来说很奇怪,我认为这里可能有数据损坏。如果我们试图诊断的查询失败,我们如何用explain来诊断有问题的查询 编辑2:进一步诊断后,我可以准确地将其定位到.limit(4308)有效和.limit(4309)barfs。然而,第4

我在某些查询中遇到“排序操作使用的内存超过最大33554432字节”错误。然而更麻烦的是,我甚至不能用
运行它。explain()

试图重新创建索引,但没有更改

这里会发生什么

编辑:为了澄清,排序字段已编制索引,并按正确的排序顺序排列。我想知道为什么解释失败了,这对我来说很奇怪,我认为这里可能有数据损坏。如果我们试图诊断的查询失败,我们如何用explain来诊断有问题的查询

编辑2:进一步诊断后,我可以准确地将其定位到
.limit(4308)
有效和
.limit(4309)
barfs。然而,第4309条记录并没有什么错


此外,这种情况发生在一个环境中,而不是在另一个环境中,除了数据之外,其他环境都是相同的。

对于未来的任何时间旅行者:

RE
.explain()
,似乎只是Mongo中的一个怪癖。要查看查询计划,必须降低限制。我猜这听起来很傻Mongo实际上运行了查询,然后显示了查询计划

值得注意的是,这是Mongo3.4。现在可能已经改变了

我们的性能问题归结为拥有一个巨大的子对象属性(我们称之为
.metaData
)。然而,因为我们知道这是有问题的,所以我们没有把它包括在投影中。但是-它确实在查找条件中显示为
{metaData:{$exists:true}
。我猜mongo获取整个内容并将其保存在内存中,只是为了对其执行
{$exists:true}
。尽管实际结果需要更少的内存,并且排序字段被索引,但这导致查询的内存限制达到32M


所以,我们活着的目的是在另一天写更多的bug…

1。从查找筛选器返回的文档太多,无法在内存2中排序。未使用/错误的索引createdI应该说明我理解错误,并且排序字段上存在索引。我只是不明白解释怎么会失败……服务器先执行然后向您解释是有道理的,如果执行查询时出现错误,它会具体解释什么?@ash allowDiskUse用于聚合。阿米尔,减少限制@AmirAbiri我敢肯定你没有为正确的字段编制索引。这是我想说的,但我想我做得不好!>实际上,它运行了查询——我想说的是Mongo确实“获取了全部内容”:,但它没有解释为什么内存排序会首先触发,因为它使用了正确的索引。如果您有机会创建一个可复制的示例,那么看到这个示例会很有趣。“使用了排序操作…”错误消息只会在实际执行内存排序时显示。也许查询计划员决定使用与您预期不同的索引,或者该索引不完全适用于他们正在进行的排序--不看解释就无法判断。(当发生这种情况时,限制为N是访问explain的正常方式——它不会更改查询计划,只会更改执行计划的文档数)我可能误读了查询计划。也许执行
{metaData:{$exists:true}
会让查询计划程序感到困惑,以至于无法在排序字段上使用索引。只需执行
{'metaData.timestamp':{$exists:true}}
即可解决问题,这是排序字段。
> db.collection.find({...}, {...}).limit(5000).sort({...})
Error: error: {
    "ok" : 0,
    "errmsg" : "errmsg: \"Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.\"",
    "code" : 96,
    "codeName" : "OperationFailed"
}

> db.collection.find({...}, {...}).limit(5000).sort({...}).explain()
2019-07-22T09:15:38.246+0000 E QUERY    [thread1] Error: explain failed: {
    "ok" : 0,
    "errmsg" : "errmsg: \"Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.\"",
    "code" : 96,
    "codeName" : "OperationFailed"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
throwOrReturn@src/mongo/shell/explainable.js:31:1
constructor/this.finish@src/mongo/shell/explain_query.js:172:24
DBQuery.prototype.explain@src/mongo/shell/query.js:521:12
@(shell):1:1