Mongodb 获取下一个和上一个文档

Mongodb 获取下一个和上一个文档,mongodb,Mongodb,在mongo收藏中,我有一个单词列表(百万单词) 我需要得到一个单词的词汇邻接词(下一个和上一个)。我在寻找最有效的方法。为什么不执行两个查询呢 第一个将查找具有“word”>“YOURWORD”的文档,按限制为1的“word”(asc)排序,然后第二个将查找具有“word”>“YOUTWORD”的文档,按限制为1的“word”(desc)排序 我猜你在这个领域有一个索引,所以它应该是相当有性能的 下面是一个代码示例: var prev = db.words.find({"word": {$gt

在mongo收藏中,我有一个单词列表(百万单词)


我需要得到一个单词的词汇邻接词(下一个和上一个)。我在寻找最有效的方法。

为什么不执行两个查询呢

第一个将查找具有“word”>“YOURWORD”的文档,按限制为1的“word”(asc)排序,然后第二个将查找具有“word”>“YOUTWORD”的文档,按限制为1的“word”(desc)排序

我猜你在这个领域有一个索引,所以它应该是相当有性能的

下面是一个代码示例:

var prev = db.words.find({"word": {$gt: "YOURWORD"}}).sort({"word": 1}).limit(1);
var next = db.words.find({"word": {$lt: "YOURWORD"}}).sort({"word": -1}).limit(1);

您的数据库是静态的还是严格地动态添加内容。@SushantGupta它不是完全静态的。但它是可读的。解决这个问题的一个方法是,只需在db中提供一个额外的字段,如
word\u index
,它存储该单词的简单词典排序。然后只需一个简单的$in查询[n-1,n,n+1],n是单词索引就可以了。但只有当它是你的db静态的时候才有意义。或者,即使您的数据库在计划的时间间隔后更新,但不是动态更新。因为db中的任何更改都需要一个完整的表更新。先前建议的一个变化是每个文档都有db引用(一个用于上一个文档,一个用于下一个文档),因此在插入新文档后,您只需要更新两个文档(在我看来,仍然非常复杂).对于像这样的网页上的一个简单功能,进行两次查询不会是不必要的开销。虽然拥有索引是一个巨大的因素,但发出db查询也一定会有一些开销。虽然我自己也在考虑将此作为我的答案,但后来我想等待一些性感的解决方案,如果有的话P@PHPst在索引之后,排序实际上非常有效。在您的例子中,索引后扫描的元素只有2个。MongoDB不能保证存储记录的顺序,因此不能依赖于静态定位:需要某种排序。另一个(不好的)选项是使用prev/next数据库引用,这涉及到在新插入和更新期间的大量处理,以保持引用的更新。如果你的更新是同时进行的,它仍然会带来一致性问题。
var prev = db.words.find({"word": {$gt: "YOURWORD"}}).sort({"word": 1}).limit(1);
var next = db.words.find({"word": {$lt: "YOURWORD"}}).sort({"word": -1}).limit(1);