我们正在开发一个使用mongoDB作为底层数据库的C ++应用程序开发工具。假设用户开发了一个患者集合,其字段为 _id (OID)& 患者#,患者#具有唯一的升序索引。假设有10名患者患者#s 1,5,7,13,14,20,21,22,23,25。患者#20显示为带限(1)。用户按下PageDown并显示患者#21 - 使用 $ gt 轻松显示患者# = 20。
当用户按下PageUp时,应显示患者#14。我(希望是错误的)解决方案是在患者#和 $ lt 上创建并行降序索引。这意味着用户创建的每个集合都需要主键字段上的两个索引才能获得双向移动。这也适用于二级索引,例如 name 。
此外,用户按下F5,提示“要移动的记录数”,他们输入3,应显示患者#23。或者他们输入-3,应显示患者#7。我的想法:首先使用一个覆盖的查询并从索引中返回以下3个患者#s,然后获取第3个文档。当简化程度较低的应用程序具有数十万个文档并且用户想要横跨数万条记录时,这一点并不理想。而且,为了实现向后运动,我相信我需要第二个下降指数。
最后,我需要一种方法让用户导航到最后一个索引条目(患者#25)。开始是微不足道的。再次,第二个指数?
我的问题:有没有办法使用(比方说)迭代器或指向当前索引元素的指针来横向升序索引,然后使用迭代器/指针算法来实现我想要的?即,+ 1将为我提供“下一个”索引元素,我可以从中获取“下一个”文档; -1表示“上一个”,+ 3表示第三个,-3表示第三个上一个;索引大小到最后。或者是否有另一个没有太多开销的解决方案(多个索引,大型覆盖查询)。
答案 0 :(得分:1)
实现目标的方法是在相关字段上建立索引,然后进行简单查询,以便在需要时获取所需的记录。
重要的是不要过度思考问题。而不是试图分解查询优化器如何遍历索引并尝试以某种方式“减少”它所做的工作,而只是使用完成工作所需的查询。
这意味着在您的情况下查询您需要的记录以及用户何时想要跳转到查询该记录的特定记录。如果某人正在查看记录27并且他们想要转到下一个记录,您可以通过降序排序和限制(1)限定符来查询大于27的最小记录。
我建议您重新选择基本上有两个主键 - 而不是具有唯一索引的单独的patientID字段,您可以在_id字段中存储patientId并使用_id上已存在的唯一索引MongoDB需要在每个系列中。
答案 1 :(得分:0)
可以在此处找到我想要做的更具体的描述:
How to get the previous mongoDB document from a compound index
答案是:在当前版本中无法完成。第二张jira票是可能的未来修复。
请参阅:SERVER-9540
和