给定具有唯一复合指数的数据:
db.employees.drop()
db.employees.insert( { employeenum : 1, check : "A" } )
db.employees.insert( { employeenum : 1, check : "B" } )
db.employees.insert( { employeenum : 2, check : "A" } )
db.employees.insert( { employeenum : 2, check : "B" } )
db.employees.insert( { employeenum : 2, check : "C" } )
db.employees.insert( { employeenum : 5, check : "E" } )
db.employees.insert( { employeenum : 6, check : "A" } )
db.employees.ensureIndex( { employeenum: 1, check : 1 }, {unique: true} )
如果我想在{ employeenum : 5, check : "E" }
之后的索引中找到下一个文档。我可以这样做:
db.employees.find({ query: { $or: [ { employeenum: { $gt: 5 } }, { check: { $gt: "E" } } ] }, $min: { employeenum: 5, check: "E" }, $maxScan: 2 })
返回{employeenum:6,check:“A”}。
但我如何从{ employeenum : 5, check : "E" }
向后追溯?如何获取{ employeenum : 2, check : "C" }
?我这样做的方式:
{ query: { $or: [ { employeenum: { $lt: 5 } }, { check: { $lt: "E" } } ] }, $hint: { employeenum: -1, check: -1 }, $min: { employeenum: 5, check: "E" }, $maxScan: 2 }
需要反向索引,这是一种非常低效的解决方案。有没有更好的办法? B树索引是双向的,不是吗?
答案 0 :(得分:0)
答案是:在当前版本中无法完成。第二张jira票是可能的未来修复。
请参阅:SERVER-9540
和
解决方法:使用我概述的反向索引或通过“使用前一个/下一个文档的主键的引用字段创建(双重)链接列表。”