我有一个场景,在弹性搜索中索引文档,我需要在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',我会返回4的文档_id,因为它是顺序的我可以创建一个mongo查询来拉取id - 2和id + 2之间的范围,在这种情况下2 - 6只要我不删除文档,这种方法效果很好。当我删除文档时,我将不得不重新索引整个系列以消除差距。我正在寻找一种方法来实现相同的结果,但也能够删除文档,而无需更新所有文档。
我愿意使用其他技术来实现这一目标,我不一定与mongodb有关。
答案 0 :(得分:1)
我可以使用以下内容获得所需的结果:
collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);
不如使用显式范围那么好,但不需要重新计算文档删除的任何内容。
是的,我知道limitations of natural order,这对我的特定用例来说不是问题。
答案 1 :(得分:0)
此问题与MongoDB无关,与此处使用不同的数据库(例如RDBMS)没有什么不同。您必须循环文件ID小于/大于当前ID并找到前两个匹配。是的,这意味着您需要执行多个查询。唯一的另一个选择是在MongoDB之上实现一个链式列表,您可以在其中存储指向右侧和左侧邻居节点的指针。是的,如果删除,您需要调整指针(基本数据结构算法....)。缺点是:您需要多个操作才能执行更改。由于MongoDB不是事务,你可能遇到不一致的上一个/下一个指针....这就是为什么MongoDB完全糟透了。