在一个mongo集合中,我有一个单词列表(百万字)。获取下一个和前一个文档
{word:'a'}
{word:'b'}
{word:'x'}
{word:'y'}
{word:'z'}
我需要得到一个词(下一个和前一个词)的词汇相邻。我正在寻找最有效的方法。
在一个mongo集合中,我有一个单词列表(百万字)。获取下一个和前一个文档
{word:'a'}
{word:'b'}
{word:'x'}
{word:'y'}
{word:'z'}
我需要得到一个词(下一个和前一个词)的词汇相邻。我正在寻找最有效的方法。
为什么你不简单地执行两个查询?
第一个将寻找与“字>‘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);
对于像<上一页|的网页上的简单功能curr_page |下一步>这将不是一个不必要的开销做2个查询。虽然有索引是一个巨大的因素,但发出一个数据库查询也必须有一些开销。虽然我自己只是想把这张贴作为我的答案,但后来我想等一些性感的解决方案,如果有的话。 :P –
@PHPst在索引之后,排序实际上是非常高效的。在你的情况下,索引后的元素SCANNED只会是2.所以它的复杂度为O(1)。 –
MongoDB并不保证您存储的记录的顺序,因此您不能依靠静态定位:您需要某种排序。 另一个(坏)选项会有prev/next db引用,在新插入和更新期间涉及大量处理,以保持引用更新。如果你的更新是非常并发的,它仍然会带来一致性问题。 – alexcasalboni
是您的数据库有点静态或动态内容添加到它严格。 –
@SushantGupta它不完全是静态的。但它是广泛阅读的。 – PHPst
解决这个问题的一个方法是,简单地在db中提供一个额外的字段,比如'word_index',它为这个单词存储一个简单的词典级别。然后只是一个简单的$ [n-1,n,n + 1]查询,n是单词索引就可以做到。但它唯一有意义的是它已经是你的数据库静态。或者即使您的数据库在计划的时间间隔后更新,但不是动态的。因为对于db中的任何更改,它都需要全表更新。 –