如何从复合索引中获取上一个mongoDB文档

如何从复合索引中获取上一个mongoDB文档,mongodb,Mongodb,鉴于此数据具有唯一的复合索引: 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

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

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之后的下一个文档,请选中:“E”}
。我可以这样做:

db.employees.find({ query: { $or: [ { employeenum: { $gt: 5 } }, { check: { $gt: "E" } } ] }, $min: { employeenum: 5, check: "E" }, $maxScan: 2 })
返回{employeenum:6,勾选:“A”}

但是如何从
{employeenum:5,勾选:“E”}
向后遍历呢?如何获取
{employeenum:2,检查:“C”}
?我的做法是:

{ query: { $or: [ { employeenum: { $lt: 5 } }, { check: { $lt: "E" } } ] }, $hint: { employeenum: -1, check: -1 }, $min: { employeenum: 5, check: "E" }, $maxScan: 2 }

需要反向索引,这是一个非常低效的解决方案。有更好的办法吗?B树索引是双向的,不是吗?答案是:在当前版本中无法实现。第二张jira罚单是未来可能的解决方案

见:


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

为什么不一起使用排序和限制来查找您的answer@Ajaybeniwal根据explain(),limit()从头到尾扫描所有文档。因此,我改用$maxScan。你是建议我用这个吗<代码>{query:{$or:[{$employeenum:{$le:1}},{$check:{$le:B{}]},$hint:{employeenum:1,check:1},$orderby:{employeenum:-1,check:-1},$max:{employeenum:1,check:{B}这会使mongoDB服务器崩溃。或者还有其他可能性吗?请尝试下面的查询,它将不会进行完全扫描,并且正确使用索引“db.Emp.find({$Or:[{employeenum:{$lt:5}]}”)、sort({employeenum:-1,check:-1}).limit(1).explain()”。此外,相同的B树索引适用于正向和反向situation@Ajay贝尼瓦尔:是的,这肯定让我得了2-C。现在,如何从2-C到2-B
db.employees.find({$or:[{{employeenum:{$lt:2}},{check:{$lt:{C}}]}).sort({employeenum:-1,check:-1}).limit(1)
返回
{employeenum:6,“check”:“A”}
我正在寻找从索引上的一点遍历索引的一般方法。谢谢你的帮助!