在mongoDb中创建ensureIndex时

时间:2014-03-03 09:53:39

标签: mongodb

我是mongoDb的新手,我不明白何时(和为什么)使用ensureIndex

例如我有这个集合

db.films.insert( { "Type" : "DVD", "Title" : "Matrix, The", "Released" :1999} )
db.films.insert( { "Type" : "DVD", "Title" : "Blade Runner", "Released" :1982 } )
db.films.insert( { "Type" : "DVD", "Title" : "Toy Story 3", "Released" :2010} )

如果我尝试

db.films.find(). min ( { Released: 1995 } ) . max ( { Released : 2005 } )

我有这个错误

error: {
    "$err" : "no index found for specified keyPattern: {} min: { Released: 1995.0 } max: { Released: 2005.0 }",
    "code" : 10367
}

我必须做

db.films.ensureIndex( { "Released": 1 } )

和所有作品。

为什么这不起作用?

db.films.find(). min ( { "Released": 1995 } ) . max ( { "Released" : 2005 } )

当我必须使用

. hint ( { Released : 1 } )

我尝试做

db.films.ensureIndex( { "Released": 1 } )
db.films.ensureIndex( { "Released": -1 } )

db.films.find() . min ( { Released: 1995 } ) . max ( { Released : 2005 } ). hint ( { Released : -1 } )

这是我的错误

error: {
    "$err" : "requested keyPattern does not match specified keys",
    "code" : 10365
}

2 个答案:

答案 0 :(得分:1)

您的查询无效,因为min()需要字段上的索引并强制查询使用索引。

答案 1 :(得分:1)

min()max()是索引运算符。它不是通过范围($lt$lte$gt$gte来限制索引的一组结果,而是通过选择实际决定扫描多少索引数据点的下限和上限。如果您还执行explain(),则可以最明显地看到这一点。

如果没有索引,MongoDB就无法限制索引。

应该注意的是,如果您希望使用minmax的路径,那么对于降序索引,您需要反转两个函数中的值以匹配反向索引。< / p>

老实说,最好将索引扫描的范围留给MongoDB的大部分时间。

如果您的查询:

db.films.find() . min ( { Released: 1995 } ) . max ( { Released : 2005 } ). hint ( { Released : -1 } )

不起作用意味着MongoDB无法找到您在索引中指定的范围。