2017-08-11 1 views
1

私は、ドキュメントを見つけるためにほとんどすべてのクエリのためにcouch dbでマンゴークエリを使用しています。ここでは、指定された条件に一致するすべてのドキュメントを取得する際の問題に直面しています。問題は、mangoクエリのデフォルトの制限が25(クエリごとに25個のドキュメントを取得することを意味する)であり、データベースに多数のドキュメントがあり、正確なドキュメント数がないことです。私は文書の上限を知らないので、マンゴー問合せの制限を厳密に記述することはできません。また、制限をハードコーディングすることは良い考えではないと思います。 誰でもこの問題を手伝ってもらえますか?制限を無制限にするにはどうすればよいですか、あるいはこのような状況に対処する他の方法はありますか?"limit"フィールドを指定せずにマンゴークエリーcouchDBを使用して無制限のドキュメントを取得する方法はありますか?

+0

を、それを解決しました。したがって、私はあなたがこの制限を回避できるとは思わない。とにかく、あなたが結果を持っているほど、処理され、httpで送信するのに時間がかかるので、制限があります。要求のページングを処理するコードを常に設計する必要があります。 –

+0

@AlexisCôtéありがとうAlexis !! :)この時点では、より良い選択肢であるように見えるので、ページ区切りのアプローチを使用します。 –

+0

私の悪い、ページネーションはまだサポートされていません(それは次のリリースの一部になるようです)、私は一時的に限界のために高い数を置くことができると思います。 –

答えて

1

私は、デフォルトの制限値を変更することができ、同じ問題に対抗し、CouchDBの2.1では再帰関数で

const batchSize = 25; 
let batchCount = 0; 
let searchResults = []; 

// in my case I want to find docs with a certain date, hardcoded here as example 
let selectedDate = '2017/10/30'; 

// the recursive function 
let search = function (count, limit){ 
    return db.find({ 
     selector: { 
      date: selectedDate 
     }, 
     limit: batchSize, 
     skip: batchCount*batchSize 
    }).then(function(batch){ 
     if (batch.docs.length === 0){ 
      // there are no (more) search results, so we can return what we have 

      return searchResults 

     } else { 
      // there may be more search results, so we add this batch to the result and call the function again to ask more. We increase the counter so that the first batch(es) are skipped 

      for (var i = 0; i < batch.docs.length; i++) { 
       searchResults.push(batch.docs[i]) 
      } 
      batchCount ++ 
      return search(batchCount, batchSize) 
     } 
    }) 
} 

search(batchCount, batchSize).then(function(result){ 
    // you can handle the searchresults 

}) 
関連する問題