5

I have a collection of about 80 million documents, each of them storing an array of tags in the tags field, e.g:

{text: "blah blah blah...", tags: ["car", "auto", "automobile"]}

The field tags is indexed, so naturally the queries like this are almost instant:

 db.documents.find({tags:"car"})

However the following queries are all very slow, taking several minutes to complete:

 db.documents.find({tags:{$all:["car","phone"]}})
 db.documents.find({tags:{$in:["car","auto"]}})

The problem persists even if the array only has a single item:

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

I thought $all and $in should be able to work very fast because tags is indexed but apparently it is not the case. Why?

4

2 回答 2

10

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

MongoDB使用$all. 仅使用索引查找数组中的第一项,并扫描所有匹配的文档以过滤结果。

例如,在查询中,db.documents.find({tags:{$all:["car","phone"]}})所有包含标签“汽车”的文档都需要被检索和扫描。由于有问题的集合包含超过十万个带有“汽车”标签的文档,因此速度放缓并不奇怪。

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

另见:https ://jira.mongodb.org/browse/SERVER-1000

于 2012-10-06T16:49:01.887 回答
-1

我只想补充一点,$in 很快。事实上,对于 1 个条件或关键字,$in 与 $all 等价,但 $in 很快,$all 很慢。

所以使用 $in。

于 2012-11-14T10:34:41.317 回答