2013-03-30 26 views
1

在一个mongo集合中,我有一个单词列表(百万字)。获取下一个和前一个文档

{word:'a'} 
{word:'b'} 
{word:'x'} 
{word:'y'} 
{word:'z'} 

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

+0

是您的数据库有点静态或动态内容添加到它严格。 –

+0

@SushantGupta它不完全是静态的。但它是广泛阅读的。 – PHPst

+0

解决这个问题的一个方法是,简单地在db中提供一个额外的字段,比如'word_index',它为这个单词存储一个简单的词典级别。然后只是一个简单的$ [n-1,n,n + 1]查询,n是单词索引就可以做到。但它唯一有意义的是它已经是你的数据库静态。或者即使您的数据库在计划的时间间隔后更新,但不是动态的。因为对于db中的任何更改,它都需要全表更新。 –

回答

2

为什么你不简单地执行两个查询?

第一个将寻找与“字>‘YOURWORD’”的文件,由“字”(ASC)与极限1分选,然后第二个将寻找与“字<‘YOUTWORD’”的文件,排序由'单词'(desc),再次限制1.

我想你已经在该领域的索引,所以它应该是相当performant。

下面是一个代码示例:

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); 
+0

对于像<上一页|的网页上的简单功能curr_page |下一步>这将不是一个不必要的开销做2个查询。虽然有索引是一个巨大的因素,但发出一个数据库查询也必须有一些开销。虽然我自己只是想把这张贴作为我的答案,但后来我想等一些性感的解决方案,如果有的话。 :P –

+0

@PHPst在索引之后,排序实际上是非常高效的。在你的情况下,索引后的元素SCANNED只会是2.所以它的复杂度为O(1)。 –

+0

MongoDB并不保证您存储的记录的顺序,因此您不能依靠静态定位:您需要某种排序。 另一个(坏)选项会有prev/next db引用,在新插入和更新期间涉及大量处理,以保持引用更新。如果你的更新是非常并发的,它仍然会带来一致性问题。 – alexcasalboni

相关问题