今天我有一个非常奇怪的问题,我无法解决几个小时。这很简单,但它涉及一个巨大的集合,所以每次我尝试使用过滤器查询时,我被卡住15分钟没有答案。我知道问题是什么,但我想理解为什么Mongo会以这种方式行事。
我的收藏大约有5000万条记录。它仅在一个记录,日期时间内编入索引,因此我们可以快速获得分析时间段,然后提取数据。我们的分析可能涉及20,000到100万条记录。
当我使用大量聚合时,我的错误是在filter子句中我在一个字段名称中添加了一个$符号。
而不是:
db.collection.find({field:{$gte:...},...})
我写道:
db.collection.find({$field:{$gte:...},...})
在两种情况下运行db.currentOp()看起来完全相同,除了$ field而不是field之外没有区别,似乎在做同样的操作。但是带有错误$符号的那个永远不会结束而且永远不会失败。
我很好奇MongoDB在这种情况下尝试做什么,以及为什么它变成一个永远不会完成的被阻止的查询。