MongoDB - 不能规范化查询

时间:2014-05-09 06:49:14

标签: c# mongodb mapreduce

我尝试使用C#驱动程序(1.9.0)和范围变量对集合运行mapreduce。 我使用以下代码:

var map = @"function() {
    emit(this._id, foo); 
};";

var reduce = @"function(key, values) { 
    return values; 
};";

var options = new MapReduceOptionsBuilder();
options.SetOutput(MapReduceOutput.Inline);
options.SetScope(new ScopeDocument("foo", "foo"));

当我使用此代码时,我得到以下异常:

  

类型' MongoDB.Driver.MongoCommandException'的例外情况发生了   在MongoDB.Driver.dll中但未在用户代码中处理

     

其他信息:Command' mapreduce'失败:例外:不能   规范化查询{}(回复:{" errmsg":"例外:可以' t   规范化查询{}","代码" :17238," ok" :0.0})

如果我删除范围变量,如下所示:

var map = @"function() {
    //emit(this._id, foo); 
    emit(this._id, 1); 
};";

var reduce = @"function(key, values) { 
    return values; 
};";

var options = new MapReduceOptionsBuilder();
options.SetOutput(MapReduceOutput.Inline);
//options.SetScope(new ScopeDocument("foo", "foo"));

有人知道这是错的吗?

1 个答案:

答案 0 :(得分:-1)

我找到了解决方案。事实证明我必须使用BsonJavaScriptWithScope而不是SetScope。

var map = @"function() {
    emit(this._id, foo); 
};";

var reduce = @"function(key, values) { 
    return values; 
};";

var scope = new BsonDocument("foo", "foo");

var args = new MapReduceArgs()
{
    MapFunction = new BsonJavaScriptWithScope(map, scope),
    ReduceFunction = new BsonJavaScript(reduce),
    OutputMode = MapReduceOutputMode.Inline
};  

var results = collection.MapReduce(args).GetResults();