1

我通过 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"

请注意,nScanned (9412) > count (4248)。

> db.collection.count()
4248

为什么?

4

1 回答 1

1

关于“nscanned”超过计数,这很可能是因为您实际上拥有的索引条目比您拥有的文档多得多:列表中的每个项目都是一个索引条目。似乎在这里,每个文档的列表中平均有 2 个项目。“nscannedObjects”遵循相同的原则,因为每当查看文档时该计数器都会增加,即使之前已将同一文档作为同一查询的一部分查看。

于 2013-10-23T00:45:16.630 回答