使用Mongo复合索引

时间:2013-12-23 18:12:02

标签: mongodb mongoose

我正在尝试为热门查询创建复合索引。

有两个字段。 String类型的'client'字段,包含IP地址。另一个是'sendOn'字段,其类型为Date。我正在寻找客户端为null且sendOn介于某个范围之间的文档。

为了支持sendOn字段的升序排序,我已经确定我需要一个值为1的sendOn索引。

所以,我跑了

> db.queries.ensureIndex({"client":1,"sendOn":1})

> db.queries.find({ $query:  { client: { $exists: false }  , sendOn: { $gt: new Date(1387664033883), $lt: new Date(1387750493883) } } }).explain()

{
        "cursor" : "BasicCursor",
        "nscanned" : 2546133,
        "nscannedObjects" : 2546133,
        "n" : 0,
        "millis" : 25071,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {

        }
}

文档说$ exists查询通常效率低下。我已经考虑过强制文档至少包含一个空客户端字段。但该查询也不使用索引?

1 个答案:

答案 0 :(得分:1)

它应该使用索引(如果您将null值替换为null值,如前所述 - $ exists运算符未针对索引进行优化)。

你可能在某些方面弄乱了一些东西:文档声明你不应该使用.explain()和$ query格式:

http://docs.mongodb.org/manual/reference/operator/meta/query/

试试这个:

db.queries.find({ $query:  { client: null  , sendOn: { $gt: new Date(1387664033883), $lt: new Date(1387750493883) } }, $explain: true });