0

鉴于此数据具有唯一的复合索引:

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,检查:“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树索引是双向的,不是吗?

4

1 回答 1

0

答案是:当前版本无法做到。第二张 jira 票是未来可能的修复。

请参阅:SERVER-9540

SERVER-9547

解决方法:使用我概述的反向索引,或通过“使用上一个/下一个文档的主键的引用字段”创建一个(双重)链表。

于 2013-05-06T05:27:20.997 回答