基于查询语法,未使用子文档上的MongoDB索引

基于查询语法,未使用子文档上的MongoDB索引,mongodb,indexing,subdocument,Mongodb,Indexing,Subdocument,我将Meteor与MongoDB一起使用,并收集了如下文档: {a: 'a1', b: 'b1', c: { d: 'd1', e: 'e1' } } 我最初创建了如下索引: collection.\u ensureIndex({'c.d':1}) 并运行如下查询: collection.find({c:{d:'d1'})。这些运行速度非常慢,当我使用explain()进行调试时,我意识到它们没有使用索引 OTOH,如果我运行这样的查询: collection.

我将Meteor与MongoDB一起使用,并收集了如下文档:

{a: 'a1',
 b: 'b1',
 c: {
     d: 'd1',
     e: 'e1'
    }
}
我最初创建了如下索引:
collection.\u ensureIndex({'c.d':1})

并运行如下查询:
collection.find({c:{d:'d1'})
。这些运行速度非常慢,当我使用explain()进行调试时,我意识到它们没有使用索引

OTOH,如果我运行这样的查询:
collection.find({'c.d':'d1')
,然后Mongo将使用索引

现在,我已将索引更改为索引整个子文档,即
集合。_ensureIndex({c:1})
,第一个查询现在命中索引

我的问题是,这是一个bug还是一个特性?我的印象是,在JSON中,这两个符号是等效的,坦率地说,我希望数据库足够聪明,能够发现这两个查询词引用的是同一个字段,并使用适当的索引

我对索引整个子文档的解决方法的担心是,最终,子文档可能包含更多我不需要索引的字段,而浪费时间和内存来保存我不需要的索引项似乎是次优的


如果这不是一个bug,有没有办法让Mongo识别嵌套对象语法并正确使用索引?

我想我是在检查Mongo文档后发现的。基本上,这两者在语义上是有区别的。基本上,在查询的第一种形式中,
{c:{d:d1}
,mongo假设您正在指定整个子文档。因此,如果您有一个子文档
{c:{d:d1,e:e1}
,它将不匹配

OTOH,查询的第二种形式
{'c.d':d1}
意味着您只在子文档中的一个字段上指定了匹配项。即使子文档有其他字段或整个子文档,这也会匹配

这种差异延伸到索引。
\u ensureIndex({c:1})
\u ensureIndex({'c.d':1})
是两个不同的索引,即使第一个索引索引整个子文档,如果使用
c.d
符号查询单个字段,也不会使用它