1

我有一个文档在弹性搜索中被索引的场景,我需要在 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,因为它是连续的,我可以创建一个 mongo 查询来拉取 id - 2 和 id + 2 之间的范围,在本例中为 2 - 6。这行得通好吧,只要我不删除文档。当我删除一个文档时,我将不得不重新索引整个系列以消除差距。我正在寻找一种实现相同结果的方法,但也能够删除文档而无需更新所有文档。

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

4

2 回答 2

1

我可以使用以下内容获得所需的结果:

collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);

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

是的,我知道natural order 的局限性,这对我的特定用例来说不是问题。

于 2012-09-08T08:05:26.177 回答
0

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

于 2012-09-08T06:57:44.743 回答