MongoDBで長時間実行しているmapreduce操作を複数回実行していて、その操作のためにopidを取得したいと考えています。 C#ドライバを使用すると、MapReduce
呼び出しがブロックされているため、操作が完了した後に戻ります。MongoDB MapReduce opidを調べる
私は進捗状況を確認できるようにmapreduce操作にタグを付けることができます。瞬時に考えることができる唯一の方法は、ユニークな識別子を持つjavascript変数を作成し、db.currentOp
の出力を反復することですその変数のために。それを行う良い方法はありますか?問題の
コード:
:私はやってよう なるかMongoCollection<BsonDocument> logCollection = database.GetCollection<BsonDocument>("source_collection");
BsonJavaScript map = new BsonJavaScript(@"function() { //map }");
BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ //reduce }");
var builder = new MapReduceOptionsBuilder();
builder.SetOutput("output_collection");
MapReduceResult mapReduceResult = logCollection.MapReduce(map, reduce, builder); //<--- Blocks until the mapreduce job completes
は(作っMapReduceJob
クラスに注意してください)非同期ジョブとしてのMapReduceを提出し、それはそうのような実行時にその進捗状況を確認しています
MongoCollection<BsonDocument> logCollection = database.GetCollection<BsonDocument>("source_collection");
BsonJavaScript map = new BsonJavaScript(@"function() { //map }");
BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ //reduce }");
var builder = new MapReduceOptionsBuilder();
builder.SetOutput("output_collection");
MapReduceJob job = logCollection.StartMapReduce(map, reduce, builder); //<--- Returns straight away
while (true)
{
Thread.Sleep(1000);
var operationDoc = database.GetCurrentOp();
var operations = operationDoc["inprog"].AsBsonArray;
var thisOperation = operations.FirstOrDefault(op => op["opid"] == job.OpId);
if (thisOperation == null)
break;
}
}
ジョブがタイムアウトを過ぎて実行されると、MapReduce呼び出しはタイムアウト例外をスローしますが、ジョブは引き続き実行されます。また、 'currentOp'出力を使って進捗状況を追跡することもできません。 –
この場合、実際にmap reduceジョブの$ cmd.sys.inprogコレクションをポーリングする必要があります。私はC#ドライバのAPIに精通していませんが、js:db.mr.mapReduce(m、r、{out:inline、myTag: 'jobID12'})のように、 )。ただし、これはmとrの関数が小さい場合にのみ機能し、そうでなければ「記録していない(大きすぎる)クエリ」を表示します。 – Ren