2016-06-13 5 views
1

mongodb java 드라이버를 사용하여 mapReducet에서 인라인 결과를 얻는 방법 3.2? 드라이버 버전 2.x I하고 있던와java mongodb 드라이버를 사용하여 mapReduce 인라인 결과 3.2

:

DBColleciont coll = client.getDB(dbName).getCollection(collName); 
coll.mapReduce(map, reduce, null, OutputType.INLINE, query); 

새로운 3.X 드라이버 두 의 MapReduce을 갖는다() 인라인 출력 모드를 지정하는 방법을 그리워 MapReduceIterable 복귀 방법. 수동으로지도-감소 명령을 만들 수 있습니다

MongoCollection<Documetn> coll = client.getDatabase(dbName).getCollection(collName) 
coll 
    .mapReduce(map, reduce). 
    .filter(query); 

답변

1

내가 찾은 것 같아요 ... mongodb의 자바 드라이버 소스에 대해 더 자세히 살펴 보았습니다. INLINE 출력 기능은 암시 적 접근 : mapReduce()의 인터페이스 반환 형식의 기본 구현입니다

class MapReduceIterableImpl<TDocument, TResult> (MapReduceIterableImpl.java가), 초기 값 trueprivate boolean inline을 보유하고 있습니다.

는 MapReduce의 기본 동작의 출력을위한 collectionName 사용을 설정하는 컬렉션을 바꾸

이 이제까지 false로 전환 될 수있는 유일한 장소는에 대한 설명은 다음과 같다있어서 collectionName(final String collectionName)이고 이 사용 동작을 변경하려면 (com.mongodb.client.model.MapReduceAction). 당신이 mapReduce() 후 객체 인스턴스에이 메소드를 호출하지 않으면

, 그것은 의미 ... 초기화 등의 true 유지됩니다 : 더 출력 컬렉션이없는 경우, 그것은 인라인해야합니다. 나중에

, 당신이 마법 if 조건을 가졌으나 내부적으로 execute() 방법은 호출되는 iterator(), first(), forEach(...) 등으로 결과를 액세스 : collectionName()가 호출되지 않은 경우는 MapReduceWithInlineResultsOperation을 instanciating되도록 ...

if (inline) { 
     MapReduceWithInlineResultsOperation<TResult> operation = 
       new MapReduceWithInlineResultsOperation<TResult>(namespace, 
         new BsonJavaScript(mapFunction), 
         new BsonJavaScript(reduceFunction), 
         codecRegistry.get(resultClass)) 
         .filter(toBsonDocument(filter)) 
         .limit(limit) 
         .maxTime(maxTimeMS, MILLISECONDS) 
         .jsMode(jsMode) 
         .scope(toBsonDocument(scope)) 
         .sort(toBsonDocument(sort)) 
         .verbose(verbose) 
         .readConcern(readConcern); 
.... 

} else { 
     MapReduceToCollectionOperation operation = 
       new MapReduceToCollectionOperation(namespace, new BsonJavaScript(mapFunction), new BsonJavaScript(reduceFunction), 
         collectionName) 
         .filter(toBsonDocument(filter)) 
         .limit(limit) 
         .maxTime(maxTimeMS, MILLISECONDS) 
         .jsMode(jsMode) 
         .scope(toBsonDocument(scope)) 
         .sort(toBsonDocument(sort)) 
         .verbose(verbose) 
         .action(action.getValue()) 
         .nonAtomic(nonAtomic) 
         .sharded(sharded) 
         .databaseName(databaseName) 
         .bypassDocumentValidation(bypassDocumentValidation); 

합니다.

내 NetBeans가 지금 나를 싫어하기 때문에 테스트 할 기회가 없었지만 꽤 분명하다고 생각합니다. 당신은 무엇을 생각하니, 나는 무엇인가 놓쳤는가?

코드를 API 3.x, 훌륭한 프로젝트로 옮기는 데 도움이된다면 다행입니다.

2

는 :

String mapFunction = ... 
    String reduceFunction = ... 

    BsonDocument command = new BsonDocument(); 

    BsonJavaScript map = new BsonJavaScript(mapFunction); 
    BsonJavaScript red = new BsonJavaScript(reduceFunction); 
    BsonDocument query = new BsonDocument("someidentifier", new BsonString("somevalue")); 
    command.append("mapreduce", new BsonString("mySourceCollection")); 
    command.append("query", query); 
    command.append("map", map); 
    command.append("reduce", red); 
    command.append("out", new BsonDocument("inline", new BsonBoolean(true))); 

    Document result = mongoClient.getDatabase(database).runCommand(command); 

나는 이것이 매우 추한 생각하지만 그것은 내가 지금까지 3.2를 사용하여 발견하는 유일한 작업 솔루션입니다. (... 그리고 더 나은 변형에도 관심이 많습니다. ;-))