【问题标题】:Index prefix doesn't work if a compound index contains 2dsphere index如果复合索引包含 2dsphere 索引,则索引前缀不起作用
【发布时间】:2014-06-19 12:44:27
【问题描述】:
> 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上查询时,为什么它不起作用?

【问题讨论】:

  • 您的带有 {x:0} 的文档没有地理空间字段?
  • 我怀疑这是一个已知的怪癖,很可能在某个地方有一个 JIRA
  • @kranteg 所有文档都有位置字段。
  • 也许SERVER-9257@Sammaye?不过,这应该是在 2.5.4 中修复的
  • @elhoyos 看起来确实如此,所以它现在应该可以工作了

标签: mongodb geospatial mongodb-indexes 2dsphere


【解决方案1】:

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

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

来自docs

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

对于包含 2dsphere 索引键以及 其他类型的keys,只有2dsphere索引字段决定是否 索引引用了一个文档。

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

编辑

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

【讨论】:

  • 所有文档都有location键,索引仍然不起作用:(
  • @user805627 有一个位置键是不够的,该字段必须是非空的...查看我的更新。
猜你喜欢
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2015-10-10
  • 1970-01-01
  • 2013-07-03
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多