强制MongoDB / mongoose中的查找查询仅使用特定索引

时间:2014-11-06 13:56:18

标签: node.js mongodb mongoose mongodb-query

我有一个集合,其中文档具有唯一的附加索引,称为index。我只想在执行某些搜索查询时使用此索引,因此我将其作为参数传递给hint。不幸的是,在explain收到的解释中,我可以看到实际上在下面的例子中扫描了5个对象,而我期望这些数字为3.以下是简单查找查询的解释输出:< / p>

> db.collection.find({"index": {$in : [1, 4, 9]}}).hint({"index": 1}).explain();
{
    "cursor" : "BtreeCursor index_1",
    "isMultiKey" : false,
    "n" : 3,
    "nscannedObjects" : 3,
    "nscanned" : 5,
    "nscannedObjectsAllPlans" : 3,
    "nscannedAllPlans" : 5,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "index" : [
            [
                1,
                1
            ],
            [
                4,
                4
            ],
            [
                9,
                9
            ]
        ]
    },
    "server" : "hostname.local:27017",
    "filterSet" : false
}
> 

那么,有没有办法实现我想要的?这不是我期待的行为。在另一个相关的说明中,我可以创建一个查询计划,然后强制使用该查询计划,以便解释中的filterSettrue(因此,而不是5个文档只会搜索3个)?当然,如果有这样的方式,我会有兴趣知道如何实现这一目标。

我还在帖子中添加了mongoose标记,因为最终我有兴趣通过mongoose发出此类查询。

1 个答案:

答案 0 :(得分:3)

使用索引时(如本例所示),nscanned是扫描的索引条目的数量,而不是文档。 nscannedObjects是扫描的文档数量,而且是3,所以事情似乎按预期工作。