> 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
和location
上创建了一个复合索引,但是当我在x
上查询时,为什么它不起作用?
答案 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说的那样,它可能是一个众所周知的怪癖。