Я выполняю несколько длительных операций mapreduce на MongoDB, и я хотел бы получить опид для этой операции во время ее выполнения.Используя драйвер C #, MapReduce
вызов блокируется, поэтому он возвращается после завершения операции.
Я хотел бы иметь возможность помечать операции 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
Что бы я хотел бы сделать, это отправить mapreduce как задание асинхронно и проверить егопрогресс, как он работает, как это (обратите внимание на состав MapReduceJob
класс):
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;
}
}