Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB复合索引实际上是如何工作的?_Mongodb_Mongodb Indexes - Fatal编程技术网

MongoDB复合索引实际上是如何工作的?

MongoDB复合索引实际上是如何工作的?,mongodb,mongodb-indexes,Mongodb,Mongodb Indexes,我在mongodb中创建复合索引时,发现了一个奇怪的行为。 我创建了一个索引: db.getCollection('Subject').createIndex({a:1, b:2, c:3}) 它创建了一个名为a_1\u b_2\u c_3的索引 现在,当我使用mongo find命令时: db.getCollection('Subject').find({a:1, b:2, c:3}) //it works fine `a_1_b_2_c_3` is used. db.getCollecti

我在mongodb中创建复合索引时,发现了一个奇怪的行为。 我创建了一个索引:

db.getCollection('Subject').createIndex({a:1, b:2, c:3})
它创建了一个名为
a_1\u b_2\u c_3
的索引

现在,当我使用mongo find命令时:

db.getCollection('Subject').find({a:1, b:2, c:3}) //it works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, b:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, c:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({b:1, c:2}) //But this command doesn't uses the index `a_1_b_2_c_3`.
有人能告诉我为什么会发生这种行为吗?

这是由于。索引
{a:1,b:1,c:1}
具有前缀
{a:1}
{a:1,b:1}
,因此在这些字段上包含过滤器的查询将使用索引


从概念上讲,把索引想象成一个B树,它从
a
上的过滤器开始,在
B
c
的较低级别上有子树。前面的查询可以很容易地从树的顶部开始并向下进行,而最后一个查询(
{b:1,c:2}
)没有简单的起点

如果您仍然想强制MongoDB使用您的索引,您可以按如下方式伪造查询(我已经对其进行了测试)。在这种情况下,我假设集合中“a”的值仅为正整数

db.Subject.explain("executionStats").find({a:{$gt:-1}, b:1, c:2})

这可能会影响其他应用程序功能,或者如果这种类型的查询是标准模式,请创建专用索引来处理查询