2014-05-09 3 views
2

C# 드라이버 (1.9.0)와 범위 변수를 사용하여 컬렉션에서 mapreduce를 실행하려고합니다. 나는 다음과 같은 코드를 사용MongoDB - 쿼리를 표준화 할 수 없습니다.

var map = @"function() { 
    emit(this._id, foo); 
};"; 

var reduce = @"function(key, values) { 
    return values; 
};"; 

var options = new MapReduceOptionsBuilder(); 
options.SetOutput(MapReduceOutput.Inline); 
options.SetScope(new ScopeDocument("foo", "foo")); 

나는 다음과 같은 예외가 얻을이 코드를 사용하는 경우 :

유형의 예외 'MongoDB.Driver.MongoCommandException가'MongoDB.Driver.dll에 발생

을 명령 '맵리 듀스가'실패 : 예외 :하지만 사용자 코드에

추가 정보가 처리되지 수 없습니다 를 정규화 쿼리 {} (응답 : { "에 errmsg": "예외 : 수 없습니다 를 정규화 쿼리 { 작동 아래와 같이 나는 범위 변수를 제거하면 0.0})

는 : :} ","코드 "17238는," "확인

는 는
var map = @"function() { 
    //emit(this._id, foo); 
    emit(this._id, 1); 
};"; 

var reduce = @"function(key, values) { 
    return values; 
};"; 

var options = new MapReduceOptionsBuilder(); 
options.SetOutput(MapReduceOutput.Inline); 
//options.SetScope(new ScopeDocument("foo", "foo")); 

사람은 잘못 알고 있나요?

+0

foo의 목적은 무엇입니까? 일부 문서 필드를 기반으로 계산됩니까? – Sebastian

+0

범위를 적용 할 때 setFinalize가 필요합니까? –

+0

@Sebastian Foo는 내지도 함수에서 결과를 필터링하기 위해 사용하려는 변수 일뿐입니다. –

답변

-1

솔로 션을 발견했습니다. SetScope 대신 BsonJavaScriptWithScope를 사용해야합니다.

var map = @"function() { 
    emit(this._id, foo); 
};"; 

var reduce = @"function(key, values) { 
    return values; 
};"; 

var scope = new BsonDocument("foo", "foo"); 

var args = new MapReduceArgs() 
{ 
    MapFunction = new BsonJavaScriptWithScope(map, scope), 
    ReduceFunction = new BsonJavaScript(reduce), 
    OutputMode = MapReduceOutputMode.Inline 
}; 

var results = collection.MapReduce(args).GetResults(); 
+0

여러 값을 사용하는 방법을 보여주기 위해 샘플을 업데이트하면 키와 값에 "foo"를 사용하는 것이 약간 혼란 스러울 수도 있습니다. 예 : var scope = new BsonDocument {{ "var1", "value1"}, { "var2", "value2"}}}; – jaccus

관련 문제