mongodb$all和$in即使在索引字段上也非常慢

mongodb$all和$in即使在索引字段上也非常慢,mongodb,Mongodb,我收集了大约8000万个文档,每个文档在标记字段中存储了一系列标记,例如: {text: "blah blah blah...", tags: ["car", "auto", "automobile"]} 字段标记被编入索引,因此像这样的查询几乎是即时的: db.documents.find({tags:"car"}) 但是,以下查询都非常慢,需要几分钟才能完成: db.documents.find({tags:{$all:["car","phone"]}}) db.documents

我收集了大约8000万个文档,每个文档在
标记
字段中存储了一系列标记,例如:

{text: "blah blah blah...", tags: ["car", "auto", "automobile"]}
字段
标记
被编入索引,因此像这样的查询几乎是即时的:

 db.documents.find({tags:"car"})
但是,以下查询都非常慢,需要几分钟才能完成:

 db.documents.find({tags:{$all:["car","phone"]}})
 db.documents.find({tags:{$in:["car","auto"]}})
即使阵列只有一项,问题仍然存在:

 db.documents.find({tags:{$all:["car"]}})  //very slow too

我认为$all和$in应该能够非常快地工作,因为
标记
是索引的,但显然不是这样。为什么?

事实证明,这是MongoDB中的一个已知错误,截至2.2版本尚未修复

当使用
$all
搜索多个条目时,MongoDB不执行索引交集。使用索引只查找数组中的第一项,并扫描所有匹配的文档以过滤结果

例如,在查询
db.documents.find({tags:{$all:[“car”,“phone”]})
中,需要检索和扫描包含标记“car”的所有文档。由于所讨论的收藏中包含了超过十万个标有“car”的文档,因此速度放缓并不令人惊讶

更糟糕的是,MongoDB甚至没有执行简单的优化,即在$all数组中选择表示最少的项进行索引查找。如果有100000个文档标记为“car”,10个文档标记为“phone”,MongoDB仍然需要扫描100000个文档以返回
{$all:[“car”,“phone”]}


另请参见:

我只想添加,$in速度很快。事实上,对于一个标准或关键字,$In与$all是等价的,然而$In是快的,$all是慢的


所以使用$in。

meybe tags=>“car”而不使用$all,或者请参见:在第页CTRL+F->$unwind
tags:“car”
工作正常,但我需要搜索包含多个标记的文档。另外,奇怪的是,
{tags:{$all:[“car”]}
tags:'car'
慢几个数量级,即使它是等效的,并且生成几乎相同的
.explain()
outputHmm 8000万个文档->当您再次运行相同的查询时,您是否及时看到任何改进。您的集合大小是您的Ram大小吗?既然您提到了它,我检查了collection stats(),结果发现总索引大小(8gb)不适合我的开发笔记本电脑(3gb)上的Ram。这可能是导致问题的原因,尽管单标记搜索仍然工作得很快。@Userpassword毕竟是一个已知的bug/错误功能,请参阅