`$exists: true` 似乎无法使用索引

问题描述 投票:0回答:1

索引:

{
   field_A: 1,
}

馆藏有100,000份文件。并且

field_A
不存在于任何文档中。

如果查询是:

{
  field_A: "some_value"
}

查找查询在 0.5 秒内正确返回零个文档

但是,如果查询是:

{
  field_A: { $exists: true }
}

它也正确返回零个文档,但需要 5 秒。

有人可以解释导致这种差异的机制吗?

mongodb mongodb-query aggregation-framework mongodb-indexes
1个回答
0
投票

很可能它使用索引。

索引(更准确地说是 B*Tree 索引)是所有值的排序列表。因此,在您的情况下,索引包含值

undefined
或类似值的 100k 倍。您必须读取所有这些值才能确定该值是否未定义。

在另一种情况下,当您查找

some_value
时,您在从索引中读取第一个条目后就已经知道结果了,因为如果该值存在,它会出现在第一个
undefined
值之前。

上面的解释不要太字面意思,它只是说明了原理。

请注意,如果值不存在,许多数据库不会在索引中存储任何值。在您的情况下,索引大小将为 0 字节。在这样的数据库中,您的索引将毫无用处。但是,MongoDB 还在索引中存储未定义的值。

© www.soinside.com 2019 - 2024. All rights reserved.