我有一个场景,文档在elastic search中被索引,我需要在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中搜索‘4’,我得到的文档_id是4,因为它是连续的,所以我可以创建一个mongo查询来拉取id - 2和id +2之间的范围,在本例中是2- 6。只要我不删除文档,这种方法就可以很好地工作。当我删除一个文档时,我将不得不重新索引整个系列以消除差距。我正在寻找一种方法,以实现相同的结果,但也能够删除文档,而不必更新所有的文档。
我对使用其他技术来实现这一点持开放态度,我不一定要依赖mongodb。
发布于 2012-09-08 16:05:26
我可以使用如下代码获得所需的结果:
collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);不像使用显式范围那样好,但在删除文档时不需要重新计算任何内容。
是的,我知道limitations of natural order,对于我的特定用例来说,这不是问题。
发布于 2012-09-08 14:57:45
这个问题与MongoDB没有特别的关系,与这里使用不同的数据库(例如关系型数据库)没有什么不同。您必须循环查找小于/大于当前id的文档id,并找到前两个匹配的id。是的,这意味着您需要执行多个查询。唯一的另一种选择是在MongoDB之上实现一个链表,在这个链表中存储指向左右相邻节点的指针。是的,在删除的情况下,你需要调整指针(基本的数据结构算法...)。缺点是:您将需要多个操作才能执行更改。由于MongoDB不是事务,你可能会遇到不一致的前一个/下一个指针……这就是为什么MongoDB在这里完全糟糕的原因。
https://stackoverflow.com/questions/12327831
复制相似问题