2011-04-05 45 views
5

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

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

{ "_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 

的所有作品,我不包括queryList在MapReduce的电话。但是,如果我确实包含queryList,那么我会得到以下运行时错误:

Command 'mapreduce' failed: db assertion failure (response: { "assertion" : "'out' has to be a string or an object", "assertionCode" : 13606, "errmsg" : "db assertion failure", "ok" : 0 }) at MongoDB.Driver.MongoDatabase.RunCommandAs[TCommandResult](IMongoCommand command) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoDatabase.cs:line 621 at MongoDB.Driver.MongoCollection.MapReduce(BsonJavaScript map, BsonJavaScript reduce, IMongoMapReduceOptions options) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 788 at MongoDB.Driver.MongoCollection.MapReduce(IMongoQuery query, BsonJavaScript map, BsonJavaScript reduce) in C:\work\10gen\mongodb\mongo-csharp-driver\Driver\Core\MongoCollection.cs:line 823 at HPSLucene.Models.Mongo.MapReduce() in C:\Inetpub\wwwroot\HPSLucene\HPSLucene\Models\Mongo.cs:line 158

任何人都知道问题是什么?非常感谢。

+1

您使用的是什么版本的C#驱动程序? – AdaTheDev 2011-04-05 12:46:49

+1

我在当前驱动程序版本下使用1.0.0.4098 – Journeyman 2011-04-05 12:49:24

回答

7

看起来它匹配了你的电话到不同的过载你认为你在呼唤

即你打算调用(查询,地图,减少)超载,但实际上它调用了(图一,减少,选项)过载。这会给你错误,因为你的第三个参数不是有效的选项参数。

尝试使用以下超载:(查询,地图,减少,选项) 然后,它将工作,不会因为要使用什么而感到困惑。

例如返回M/R内嵌的结果,而不是存储在一个集合中:

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

这个语法看起来不是有效的,相反,必须通过@Journeyman的答案中显示的'options'参数来设置一个过滤器。 – 2017-12-06 00:02:36

3

顺便说一句,下面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); 
+0

近六年后的今天,这个代码示例仍然有用! – Alan 2017-04-04 22:19:32

+0

虽然有用,但似乎没有显示任何对'queryList'的使用(已分配,但未使用)。 – 2017-12-06 00:03:17

0

我创建了一个测试程序重现这一点,它似乎实际上调用了MapReduce的正确重载。但是您遇到了驱动程序中的错误。我创建了一个JIRA情况下它:

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

你的最终版本是好的。通过提供明确的选项参数,您正在解决该错误。

+0

现在已在主分支上修复此问题,修复将在下一个版本中进行修复。如果您希望早日修复,您可以自行获取源代码并自行构建驱动程序。感谢您报告这个! – 2011-04-05 14:56:11

+0

如果您有机会阅读我写的测试程序,您可以在这里看到:http://www.pastie.org/1759045 – 2011-04-05 15:01:19