c# - MongoDB - 无法规范化查询

标签 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"));

当我使用这段代码时,出现以下异常:

An exception of type 'MongoDB.Driver.MongoCommandException' occurred in MongoDB.Driver.dll but was not handled in user code

Additional information: Command 'mapreduce' failed: exception: Can't canonicalize query {} (response: { "errmsg" : "exception: Can't canonicalize query {}", "code" : 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"));

有谁知道这是错的吗?

最佳答案

我找到了解决方案。事实证明我必须使用 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();

关于c# - MongoDB - 无法规范化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23558258/

相关文章:

c# - 在 C++ DLL 和 C# GUI 之间传递数据时结果不一致

c# - 如何换出主窗体?

java - 将 wget 与 Hadoop 一起使用?

scala - 为什么 Spark 不允许 map-side 与数组键组合?

c# - WPF 样式未在运行时应用

c# - 词典<>性能

javascript - Mongoose 未保存正确的架构

mongodb - Azure Cosmos DB Mongodb $t 和 $v

spring - 使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

hadoop - 由于错误 JA017,Oozie 工作流失败