MongoDB索引不会减少nscannedObjects

时间:2013-05-31 20:44:07

标签: mongodb

在MongoDB中,我有以下简单查询,postTime上的索引:-1。该系列有100,237份文件。 explain()表示查询完全由索引覆盖。

为什么nScannedObjects是100,237?此外,即使我只对前5个结果感兴趣,查询时间也是455毫秒。

我做错了什么,或者这是MongoDB的工作方式?有人可以解释为什么索引查询需要这么长时间吗?

谢谢:) Les

db.guestBookPost.find({ postTime : {$gte : 0}, $orderby : { "postTime" : -1}}, {_id:0, >postTime:1}).limit(5).explain()
{
    "cursor" : "BtreeCursor postTime_-1",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 100237,
    "nscanned" : 100237,
    "nscannedObjectsAllPlans" : 200474,
    "nscannedAllPlans" : 200474,
    "scanAndOrder" : false,
    "indexOnly" : true,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 455,
    "indexBounds" : {
    "postTime" : [
            [
                1.7976931348623157e+308,
                0
            ]
        ]
    },
    "server" : "ip-10-245-26-151:27017"
}

1 个答案:

答案 0 :(得分:0)

使用$orderby语法似乎是导致它的原因。您可以使用:

db.guestBookPost.
  find({ postTime : {$gte : 0}}, {_id:0, >postTime:1}).
  sort({postTime: -1}).
  limit(5).
  explain()

或者:

db.guestBookPost.
  find({ postTime : {$gte : 0}}, {_id:0, >postTime:1}).
  _addSpecial("$orderBy", {postTime: -1}).
  limit(5).
  explain()

它会正常工作。我不确定为什么$ orderby语法不能正常工作,但这些方法中的任何一种都应该解决它。