如果复合索引包含2dsphere索引,则索引前缀不起作用

时间:2014-06-19 12:44:28

标签: mongodb geospatial mongodb-indexes 2dsphere

> db.test.ensureIndex({x: 1, location: '2dsphere'})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.test.find({x: 0}).explain()
{
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 100009,
        "nscanned" : 100009,
        "nscannedObjectsAllPlans" : 100009,
        "nscannedAllPlans" : 100009,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 781,
        "nChunkSkips" : 0,
        "millis" : 40,
        "server" : "hackintosh:27017",
        "filterSet" : false
}

MongoDB版本:2.6.2

我在xlocation上创建了一个复合索引,但是当我在x上查询时,为什么它不起作用?

1 个答案:

答案 0 :(得分:1)

我猜测您的文档没有location密钥或location为空,因此除非明确暗示,否则您的查询不会使用该索引。

这可能是因为MongoDB 2.6中的2dsphere索引是稀疏的。您可以使用hint()显式指定索引,但即使这样,您也不会找到没有location字段的文档,因为它们不会添加到索引中。

来自docs

  

如果文档缺少2dsphere索引字段(或该字段为null或者为   空数组),MongoDB不会为文档添加条目   2dsphere指数。对于插入,MongoDB插入文档但不插入   添加到2dsphere索引。

     

对于包含2dsphere索引键的复合索引   其他类型的键,只有2dsphere索引字段确定是否   索引引用文档。

如果你真的必须通过x字段找到文件,无论loc是否设置,我建议只为该字段添加一个单独的索引(非稀疏索引)。

修改

我做了一些额外的测试。在这种情况下,MongoDB似乎总是默认使用BasicCursor,除非您使用hint明确指定索引。就像Sammaye说的那样,它可能是一个众所周知的怪癖。