2011-04-05 5 views
5

MapReduce API 호출에 쿼리를 통합하는 매우 기본적인 map-reduce 예제를 만들려고합니다. 다음과 같이MongoDB MapReduce 호출 내에서 쿼리를 포함하려고 시도했습니다.

내 컬렉션 형식의 항목이 많이있다 :

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

코드는 다음과 같다 : 나는 맵리 듀스 호출에 queryList에 포함되지 않습니다

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를 포함하면 다음 런타임 오류가 발생합니다.

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

+1

현재 드라이버 버전에서 1.0.0.4098 – Journeyman

답변

7

이 보이는 , 감소, 옵션) 과부하. 세 번째 arg가 유효한 옵션 인수가 아니므로이 오류가 발생합니다.

다음과 같은 오버로드를 사용해보십시오. (쿼리, 매핑, 축소, 옵션) 그러면 어떤 것을 사용할 지 혼동하지 않으므로 작동합니다.

는 M/R 인라인의 결과를 반환하고하지 않는 것은 컬렉션 저장 :

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

을 사용하고 있습니다.이 구문이 유효하지 않은 대신, @ Journeyman의 대답과 같이'options' 매개 변수를 통해 필터를 설정해야합니다. –

3

을, BTW 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

거의 6 년 후이 코드 예제는 여전히 유용했습니다! – Alan

+0

유용하지만, 이것은 'queryList' (할당되었지만 사용되지 않음)를 사용하지 않는 것으로 보입니다. –

0

나는 테스트 프로그램을 만들어 이를 재현하고 MapReduce의 정확한 오버로드를 호출하고있는 것 같습니다. 그러나 운전자에게 벌레가 발생했습니다. 나는 그것을 위해 JIRA 케이스를 만들었습니다

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

귀하의 최종 버전은 괜찮습니다. 명시 적 옵션 매개 변수를 제공하면 버그를 해결할 수 있습니다.

+0

이 문제는 이제 master 분기에서 수정되었으며 다음 릴리스에서 수정 될 것입니다. 빨리 문제를 해결하려면 소스를 가져 와서 드라이버를 직접 빌드하십시오. 이 문제를 신고 해 주셔서 감사합니다. –

+0

내가 작성한 테스트 프로그램을 읽는 것이 도움이 될 수있는 기회가 왔을 때 여기에서 확인할 수 있습니다 : http://www.pastie.org/1759045 –

관련 문제