0
> 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

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

4

1 回答 1

1

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

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

文档

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

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

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

编辑

我做了一些额外的测试。在这种情况下,似乎 MongoDB 将始终默认为 using ,除非您使用提示BasicCursor明确指定索引。正如 Sammaye 所说,这可能是一个众所周知的怪癖。

于 2014-06-19T13:19:32.553 回答