索引:
{
field_A: 1,
}
馆藏有100,000份文件。并且
field_A
不存在于任何文档中。
如果查询是:
{
field_A: "some_value"
}
查找查询在 0.5 秒内正确返回零个文档
但是,如果查询是:
{
field_A: { $exists: true }
}
它也正确返回零个文档,但需要 5 秒。
有人可以解释导致这种差异的机制吗?
很可能它使用索引。
索引(更准确地说是 B*Tree 索引)是所有值的排序列表。因此,在您的情况下,索引包含值
undefined
或类似值的 100k 倍。您必须读取所有这些值才能确定该值是否未定义。
在另一种情况下,当您查找
some_value
时,您在从索引中读取第一个条目后就已经知道结果了,因为如果该值存在,它会出现在第一个 undefined
值之前。
上面的解释不要太字面意思,它只是说明了原理。
请注意,如果值不存在,许多数据库不会在索引中存储任何值。在您的情况下,索引大小将为 0 字节。在这样的数据库中,您的索引将毫无用处。但是,MongoDB 还在索引中存储未定义的值。