尝试在MongoDB MapReduce调用中包含查询

本文关键字:包含 查询 调用 MapReduce MongoDB | 更新日期: 2023-09-27 17:49:17

我正在尝试创建一个非常基本的map-reduce示例,该示例还在MapReduce api调用中合并了查询。

我的收藏有很多条目,格式如下:

{ "_id" : { "$binary" : "PdYV4WMTAEyYMQHXJZfzvA==", "$type" : "03" }, 
    "firstname" : "Matthew", 
    "surname" : "Chambers", 
    "email" : "" }

代码如下:

var map = @"
function() {
    emit(this.surname, { count : 22 });
}";
var reduce = @"
function(key, emitValues) {
    return { count : emitValues[0].count };
}";
List<BsonValue> contactIds = new List<BsonValue>();
contactIds.Add(new Guid("A04FC88D-7BF7-443D-B5C3-EB11EE2B36DF"));
contactIds.Add(new Guid("26B690B3-5ED7-47F4-A878-3906E28BBC58"));
MongoDB.Driver.Builders.QueryConditionList queryList = MongoDB.Driver.Builders.Query.In("_id", BsonArray.Create(contactIds));
//var mr = personCollection.MapReduce(map, reduce);// THIS WORKS!    
var mr = personCollection.MapReduce(queryList, map, reduce); // THIS FAILS

如果我在MapReduce调用中不包含queryList,它就会工作。但是,如果包含queryList,则会得到以下运行时错误:

命令'mapreduce' failed: db断言失败(response: {"assertion": "'out'必须是字符串或对象","assertionCode": 13606, "errmsg": "db断言失败","ok": 0})在MongoDB.Driver.MongoDatabase。RunCommandAs[TCommandResult](IMongoCommand命令)在C:'work'10gen'mongodb' mongodb -csharp- Driver' Driver'Core'MongoDatabase.cs:line 621 at mongodb .Driver. mongocollection。MapReduce(BsonJavaScript地图,BsonJavaScript减少,IMongoMapReduceOptions选项)在C:'work'10gen'mongodb' mongodb -csharp- Driver' Driver'Core'MongoCollection.cs:行788在mongodb .Driver. mongocollection。MapReduce(IMongoQuery查询,BsonJavaScript地图,BsonJavaScript减少)在C:'work'10gen'mongodb'mongo-csharp-driver'Driver'Core'MongoCollection.cs: 823行在HPSLucene.Models. mongodb .MapReduce()在C:'Inetpub'wwwroot'HPSLucene'HPSLucene'Models'蒙古.cs: 158行

有谁知道是什么问题吗?非常感谢。

尝试在MongoDB MapReduce调用中包含查询

看起来你的调用与你认为你正在调用的重载是不同的

。你打算调用(query, map, reduce)重载,但实际上它调用的是(map, reduce, options)重载。这会导致错误,因为第三个参数不是有效的选项参数。

尝试使用以下重载:(query, map, reduce, options)然后它将工作,因为不会混淆使用哪个。

。将M/R的结果内联返回,而不是存储在集合中:

var mr = personCollection.MapReduce(queryList, map, reduce, 
                MapReduceOptions.SetOutput(MapReduceOutput.Inline));

顺便说一句,根据AdaTheDev的回答,这是我最终的结果:

List<BsonValue> contactIds = new List<BsonValue>();
contactIds.Add(new Guid("A04FC88D-7BF7-443D-B5C3-EB11EE2B36DF"));
contactIds.Add(new Guid("26B690B3-5ED7-47F4-A878-3906E28BBC58"));
MongoDB.Driver.Builders.QueryConditionList queryList = MongoDB.Driver.Builders.Query.In("_id", BsonArray.Create(contactIds));
MongoDB.Driver.Builders.MapReduceOptionsBuilder builder=new MongoDB.Driver.Builders.MapReduceOptionsBuilder();
builder.SetOutput(MongoDB.Driver.Builders.MapReduceOutput.Inline);
var mr = personCollection.MapReduce(map, reduce, builder);

我创建了一个测试程序来重现这一点,看起来它实际上调用了MapReduce的正确重载。但是你在驱动程序中遇到了一个bug。我已经为它创建了一个JIRA案例:

http://jira.mongodb.org/browse/csharp - 193

你的最终版本很好。通过提供一个显式的选项参数,您可以绕过这个错误。