我通过Casbah(Mongo的Scala库)创建了一个多键复合索引:
db.collection.ensureIndex(MongoDBObject("Header.records.n" -> 1) ++ MongoDBObject("Header.records.v" -> 1) ++ MongoDBObject("Header.records.l" -> 1))
然后,通过Mongo Shell,我执行了一个db.collection.find(...).explain
,其中nScannedObjects
超过了db.collection.count()
。查看 Mongo 文档,似乎需要调用一次 ensureIndex,然后任何写入都将强制更新索引。
但是,我看到了一个帖子,这个帖子只需要db.collection.ensureIndex(...)
打电话一次。
编辑
>db.collection.find( {"Header.records" : {$all : [
{$elemMatch: {n: "Name", v: "Kevin",
"l" : { "$gt" : 0 , "$lt" : 15}} }]}},
{_id : 1}).explain()
{
"cursor" : "BtreeCursor
Header.records.n_1_Header.records.v_1_Header.records.l_1",
"isMultiKey" : true,
"n" : 4098,
"nscannedObjects" : 9412,
"nscanned" : 9412,
"nscannedObjectsAllPlans" : 9412,
"nscannedAllPlans" : 9412,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 152,
"indexBounds" : {
"Header.records.n" : [
[
"Name",
"Name"
]
],
"Header.records.v" : [
[
"Kevin",
"Kevin"
]
],
"Header.records.l" : [
[
0,
1.7976931348623157e+308
]
]
},
"server" : "ABCD:27017"
请注意,n扫描 (9412)>计数 (4248)。
> db.collection.count()
4248
为什么?
关于"nscanned"超过计数,这是可能的,因为你实际上拥有的索引条目比你拥有的文档多得多:列表中的每个项目都是一个索引条目。似乎在这里,每个文档的列表中平均有 2 个项目。"nscannedObjects"遵循相同的原则,因为每当查看文档时,该计数器都会递增,即使之前已将同一文档作为同一查询的一部分查看。