首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于_id的序列文档检索

基于_id的序列文档检索
EN

Stack Overflow用户
提问于 2012-09-08 11:44:34
回答 2查看 232关注 0票数 1

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

如果我使用顺序_id,我现在就可以成功地完成这项工作。作为示例,使用以下数据:

代码语言:javascript
复制
[
    {_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中搜索‘4’,我得到的文档_id是4,因为它是连续的,所以我可以创建一个mongo查询来拉取id - 2和id +2之间的范围,在本例中是2- 6。只要我不删除文档,这种方法就可以很好地工作。当我删除一个文档时,我将不得不重新索引整个系列以消除差距。我正在寻找一种方法,以实现相同的结果,但也能够删除文档,而不必更新所有的文档。

我对使用其他技术来实现这一点持开放态度,我不一定要依赖mongodb。

EN

回答 2

Stack Overflow用户

发布于 2012-09-08 16:05:26

我可以使用如下代码获得所需的结果:

代码语言:javascript
复制
collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);

不像使用显式范围那样好,但在删除文档时不需要重新计算任何内容。

是的,我知道limitations of natural order,对于我的特定用例来说,这不是问题。

票数 1
EN

Stack Overflow用户

发布于 2012-09-08 14:57:45

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12327831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档