尝试在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行
看起来你的调用与你认为你正在调用的重载是不同的
。你打算调用(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你的最终版本很好。通过提供一个显式的选项参数,您可以绕过这个错误。