2013-04-30 16 views
0

得到以前的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 : "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樹索引是雙向的,不是嗎?

+0

爲什麼不使用排序和限制在一起找出答案 – 2013-04-30 19:13:19

+0

@Ajay beniwal根據explain(),limit()掃描索引點到結尾的所有文檔。因此,我爲什麼使用$ maxScan代替。你建議我用這個嗎? '{query:{$ or:[{employeenum:{$ le:1}},{check:{$ le:'B'}}]},$ hint:{employeenum:1,check:1},$ orderby :{employeenum:-1,檢查:-1},$ max:{employeenum:1,檢查:「B」}}'這使mongoDB服務器崩潰。或者還有另外一種可能性? – 2013-04-30 22:26:04

+0

請給下面的查詢嘗試它不會做全面掃描和正確使用索引「db.Emp.find({$或:[{employeenum:{$ lt:5}}]})。sort({employeenum:-1 ,檢查:-1})。limit(1).explain()「.Moreover相同的B-樹索引工作的正向和反向情況 – 2013-05-01 05:10:33

回答

0

答案是:它不能在當前版本中完成。第二張傑拉票是未來可能的解決方案。

參見:SERVER-9540

SERVER-9547

的替代方法:如我概述使用反向索引或通過創建(雙)鏈表「通過使用參考場的主鍵的前一個/下一個文件「。