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