0

我们正在开发一个使用 mongoDB 作为底层数据库的 C++ 应用程序开发工具。假设用户开发了一个患者集合,其中包含字段_id (OID) 和患者# ,并且患者#具有唯一的升序索引。假设有 10 位患者,患者编号为 1、5、7、13、14、20、21、22、23、25。患者编号 20 显示为使用 limit(1) 获取。用户按下 PageDown 并显示患者# 21 -- 使用$gt患者# = 20 很容易。

当用户按下 PageUp 时,应该显示第 14 号患者。我的(希望是错误的)解决方案是在patient#$lt上创建并行降序索引。这意味着用户创建的每个集合都需要主键字段上的两个索引才能进行双向移动。这也适用于name等二级索引。

此外,用户按 F5,提示“要移动的记录数”,他们输入 3,应显示患者#23。或者他们输入-3,应该显示患者# 7。我的想法:首先使用覆盖查询并从索引中返回以下 3 个患者#s,然后获取第 3 个文档。当一个不太简单的应用程序有数十万个文档并且用户想要横切成千上万条记录时,这根本不理想。而且,再次,为了实现向后运动,我相信我需要第二个降序索引。

最后,我需要一种方法让用户导航到最后一个索引条目(患者 #25)。回到起点是微不足道的。再次,第二个索引?

我的问题:有没有办法使用(比如说)迭代器或指向当前索引元素的指针来横向升序索引,然后使用迭代器/指针算法来实现我想要的?即,+1 将为我提供“下一个”索引元素,我可以从中获取“下一个”文档;-1 “前一个”,+3 后第三个,-3 前第三个;索引大小到最后。或者是否有另一种没有太多开销的解决方案(多个索引、大型覆盖查询)。

4

2 回答 2

1

实现您想要的方法是在相关字段上建立索引,然后在需要时进行简单查询以获取所需的记录。

重要的是不要过度思考问题。与其尝试分解查询优化器如何遍历索引并尝试以某种方式“减少”它所做的工作,不如使用完成工作所需的查询。

这意味着在您的情况下查询您需要的记录以及当用户想要跳转到查询该记录的特定记录时。如果有人正在查看记录 27 并且他们想转到下一个记录,您可以通过降序排序和 limit(1) 限定符查询大于 27 的最小记录。

我鼓励您重新审视您的选择,基本上拥有两个主键 - 而不是具有唯一索引的单独的 patientID 字段,您可以将 patientId 存储在 _id 字段中,并使用 _id 上已经存在的唯一索引,这是 MongoDB 在每个收藏。

于 2013-04-24T03:47:33.137 回答
0

可以在这里找到关于我正在尝试做的更具体的描述:

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

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

请参阅:SERVER-9540

SERVER-9547

于 2013-05-06T05:23:23.183 回答