Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找MongoDB MapReduce opid_C#_Mongodb_Mapreduce - Fatal编程技术网

C# 查找MongoDB MapReduce opid

C# 查找MongoDB MapReduce opid,c#,mongodb,mapreduce,C#,Mongodb,Mapreduce,我正在MongoDB上运行多个长期运行的mapreduce操作,我希望在该操作运行时获得该操作的opid。使用C#driver,MapReduce调用被阻塞,因此在操作完成后返回 我希望能够标记mapreduce操作,以便检查它们的进度,目前我能想到的唯一方法是创建一个具有唯一标识符的javascript变量,并遍历db.currentOp的输出以查找该变量。有更好的方法吗 有关守则: MongoCollection<BsonDocument> logCollection = dat

我正在MongoDB上运行多个长期运行的mapreduce操作,我希望在该操作运行时获得该操作的opid。使用C#driver,
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

让MapReduceJob创建一个新线程来执行阻塞MapReduce调用怎么样?您应该能够通过维护一个正确同步的标志来轻松判断map reduce作业是否完成。

不完全正确。如果作业运行超过超时,则MapReduce调用将引发超时异常,但作业将继续运行。它也不允许我跟踪进度,这可以使用
currentOp
output来实现。在这种情况下,您必须为map reduce作业轮询$cmd.sys.inprog集合。我不太熟悉C#驱动程序的API,但实际上可以在mr查询上附加任意标记,如js:db.mr.mapReduce(m,r,{out:inline,myTag:'jobID12'})中所示。但是,这仅在m和r函数很小时有效,否则将显示“查询未记录(太大)”。
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;
    }
}