我是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
}
答案 0 :(得分:1)
您的查询无效,因为min()需要字段上的索引并强制查询使用索引。
答案 1 :(得分:1)
min()
和max()
是索引运算符。它不是通过范围($lt
,$lte
,$gt
和$gte
来限制索引的一组结果,而是通过选择实际决定扫描多少索引数据点的下限和上限。如果您还执行explain()
,则可以最明显地看到这一点。
如果没有索引,MongoDB就无法限制索引。
应该注意的是,如果您希望使用min
和max
的路径,那么对于降序索引,您需要反转两个函数中的值以匹配反向索引。< / p>
老实说,最好将索引扫描的范围留给MongoDB的大部分时间。
如果您的查询:
db.films.find() . min ( { Released: 1995 } ) . max ( { Released : 2005 } ). hint ( { Released : -1 } )
不起作用意味着MongoDB无法找到您在索引中指定的范围。