Mongodb 基于_id检索顺序文档

Mongodb 基于_id检索顺序文档,mongodb,nosql,Mongodb,Nosql,我有一个场景,文档在弹性搜索中被索引,我需要在mongo中检索匹配的文档,以及按时间戳排序的前面和后面的文档。其思想是检索文档的上下文以及原始文档 如果我使用一个连续的_id,我现在可以成功地完成这项工作。例如,使用以下数据: [ {_id: 1, value: 'Example One' }, {_id: 2, value: 'Example Two' }, {_id: 3, value: 'Example Three' }, {_id: 4, value: '

我有一个场景,文档在弹性搜索中被索引,我需要在mongo中检索匹配的文档,以及按时间戳排序的前面和后面的文档。其思想是检索文档的上下文以及原始文档

如果我使用一个连续的_id,我现在可以成功地完成这项工作。例如,使用以下数据:

[
    {_id: 1, value: 'Example One' },
    {_id: 2, value: 'Example Two' },
    {_id: 3, value: 'Example Three' },
    {_id: 4, value: 'Example Four' },
    {_id: 5, value: 'Example Five' },
    {_id: 6, value: 'Example Six' },
    ...
]
如果我在ES中搜索'Four',我会返回文档id 4,因为它是连续的,所以我可以创建一个mongo查询来提取id-2和id+2之间的范围,在本例中是2-6。只要我不删除文档,这就行了。当我删除一个文档时,我必须对整个系列重新编制索引以消除间隙。我正在寻找一种方法来实现相同的结果,但也能够删除文档而不必更新所有文档


我愿意使用其他技术来实现这一点,我不一定与mongodb有联系。

这个问题与mongodb无关,与在这里使用不同的数据库(例如RDBMS)没有什么不同。您必须循环查找小于/大于当前id的文档id,并找到前两个匹配的id。是的,这意味着您需要执行多个查询。唯一的另一种选择是在MongoDB的顶部实现链表,在这里存储指向左右相邻节点的指针。是的,在删除的情况下,您需要调整指针(基本数据结构算法…)。缺点是:您将需要多个操作来执行更改。由于MongoDB不是事务,您可能会遇到前后不一致的指针……这就是为什么MongoDB在这里非常糟糕。

这个问题与MongoDB无关,与在这里使用不同的数据库(例如RDBMS)没有什么不同。您必须循环查找小于/大于当前id的文档id,并找到前两个匹配的id。是的,这意味着您需要执行多个查询。唯一的另一种选择是在MongoDB的顶部实现链表,在这里存储指向左右相邻节点的指针。是的,在删除的情况下,您需要调整指针(基本数据结构算法…)。缺点是:您将需要多个操作来执行更改。由于MongoDB不是事务,您可能会遇到前后不一致的指针……这就是为什么MongoDB在这里非常糟糕。

我可以使用以下方法获得所需的结果:

collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);
没有使用显式范围那么好,但是不需要在删除文档时重新计算任何内容


是的,我知道,对于我的特定用例来说,这不是一个问题

我可以使用以下方法获得所需的结果:

collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);
没有使用显式范围那么好,但是不需要在删除文档时重新计算任何内容


是的,我知道,对于我的特定用例来说,这不是一个问题

在使用RDBMS时,还有其他方法可以解决这个问题。例如,使用SQL Server,我可以使用带有行号的CTE。我可能能够得到什么,我正在寻找使用地图减少功能。在使用关系数据库管理系统时,还有其他方法可以解决这个问题。例如,使用SQL Server,我可以使用带有行号的CTE。我可能能够得到什么,我正在寻找使用地图减少功能。关于自然顺序的一个警告:除非你有一个上限集合,否则随着时间的推移,自然顺序将不会像你期望的那样与“之前/之后”文档匹配。特别是,文档删除和移动将在可用数据空间中创建空白,文档可以插入或移动到该空间。如果需要某个顺序(例如插入顺序),则应使用显式索引排序()。在您的示例中,您希望在
\u id
字段上进行排序。关于自然顺序的一个注意事项是:除非您有一个有上限的集合,否则随着时间的推移,自然顺序将与您期望的“之前/之后”文档不匹配。特别是,文档删除和移动将在可用数据空间中创建空白,文档可以插入或移动到该空间。如果需要某个顺序(例如插入顺序),则应使用显式索引排序()。在您的示例中,您希望在
\u id
字段上进行排序。