2011-04-05 44 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