2016-08-01 3 views
0

この問題はmongodbで直面しています。 私のコードは、この集約ピンプラインエラー:getMore:サーバー上にカーソルが存在しませんでした。再起動またはタイムアウトが発生する可能性があります。

for(loop) { 
    var cursorQuery = db.beacon_0000.aggregate([ 
     { 
      $match: { 
       ... 
      } 
     }, 
     { 
      $project: { 
       ... 
      } 
     }, 
     { 
      $group: { 
       ... 
      } 
     }, 
     { 
      $sort: { 
       ... 
      }  
     } 
    ], {allowDiskUse: true}); 
    ... 
    while(cursorQuery.hasNext()) { 
     var cursor = cursorQuery.next(); 
     ... 
    } 
} 

のようなもので、私はカーソルが行のcursorQueryでサーバーエラーに存在しませんでした取得しばらく

$ mongo dbName file.js 

としてコマンドとモンゴシェルを経由して上記のクエリを実行します。 hasNext()。私はこのエラーを取得する場合は、検索クエリで

は、私はしかし、このオプションは、私はこの問題を解決または回避策ことができますどのように教えてください集計

で利用可能ではないようですaddOption(DBQuery.Option.noTimeout) を追加することで解決することができます。ただ、追加のアップデートを提供するために、

: 私は

var cursor = db.collection..aggregate([ ...], {allowDiskUse: true}).addOption(DBQuery.Option.noTimeout) 

を使用すると言うとき、私はこのエラー E QUERY TypeError例外を取得します。オブジェクトの#は何のメソッド 'addOption'

を持っていない私は

を使用すると言うしかし、とき
var cursor = db.collection..find({...}, {...}).addOption(DBQuery.Option.noTimeout) 

正常に動作します。なしありアグリゲーションパイプライン動作

の最終段階で作成されたドキュメントにカーソルそしてチェックカーソルドキュメント https://docs.mongodb.com/v3.0/reference/method/cursor.addOption/#cursor.addOption

: 戻り値:集計DOC https://docs.mongodb.com/v3.0/reference/method/db.collection.aggregate/ それが言うの確認

集約カーソルがfindカーソルと異なること、そして前者がDBQuery.Option.noTimeoutをサポートしていないことを示唆しています。

これはmongodbにバグがあります。それを修正する方法や回避策があります。

注意MongoDBのバージョンは、あなたがソートの自分でこれを答えている3.0

答えて

0

です。それはタイムアウトからcursorを停止し、したがって、それはaggregationためcursorは、そのオプションを持っていません。しかし、あなたは.hasNext()

をしようとしたときに存在しますので、findを使用した場合、実際の問題を修正するオプションaddOption(DBQuery.Option.noTimeout)を追加する


残念ながらタイムアウトしないようにすることはできません。

+0

ここに私のオプションは何ですか? batchSizeを大きな値に設定すると、ここで役立ちます。 say db.collection.aggregate().batchSize(10000) カーソルが集約パイプラインのタイムアウトにならないようにするには、他に何かお勧めします。 –

+0

集計時間を短縮する人は、あなたが望むものです。 'cursor'がタイムアウトするのを防ぐことができないと考えると、デフォルトのタイムアウトの長さ内で使用する必要があります。彼らはこれを修正しようとしているように見えます。参照:https://jira.mongodb.org/browse/SERVER-6036 – AJenkins

0

私は同じ問題を抱え、アイドルカーソルタイムアウトをデフォルトの10分から1時間に設定することで解決しました。これはmongodb 2.6.9以降で設定可能です。参照:

デフォルトのカーソルのタイムアウトは600000ミリ秒= 10分です。あなたはさまざまな方法でそれを変更することができます。

  • 起動時に:mongod --setParameter cursorTimeoutMillis=<num>
    • か:mongos --setParameter cursorTimeoutMillis=<num>
  • または動作中に、モンゴシェルを使用して:db.adminCommand({setParameter:1, cursorTimeoutMillis: <num>})

Mongosですコマンドをクラスターのmongodに転送しません。また、プライマリはreplicaSetメンバにコマンドを複製しません。したがって、クエリが実行されるすべてのmongosおよびmongodでコマンドを実行する必要があります。

+0

cursorTimeoutMillisは、サーバ全体のデフォルトのタイムアウト時間を変更します。これが不可能な場合は、しばらくの間、ソリューションは集約を記録しているため、実行速度は向上します。 – Corral

関連する問題