2017-12-08 8 views
3

MongoDB를 처음 사용했기 때문에 귀하의 도움에 감사드립니다.MongoDB는 180 레벨의 중첩 수준을 초과하여 문서를 삽입 할 수 없습니다.

MongoDB의 java 드라이버 3.4.2를 사용하여 map/reduce를 시도하고 있습니다.

는 I는 이와 같은 문서를 갖는 컬렉션 Collection의있다 : I가 myArray의 모든 조합을 얻기하고자

{ 
    "_id" : ObjectId("5a29a6757c5def07307a4b6f"), 
    "someProperty1" : "454545", 
    "someProperty2" : "1234", 
    "myArray" : [ 
     "1", 
     "2", 
     "3", 
    ] 
} 

[1,2] [1,3] [2,1] [2,3] [3,1] [3,2]

가장 긴 myArray에는 20 개의 요소가 있습니다.

나는 다음을 사용하여 시도했다 : 나는 적은 양의 데이터를 테스트 할 때

db.collectionA.mapReduce(
    function() { 
     var elem= this; 
     this.myArray.forEach(function (parent) { 
      elem.myArray.forEach(function (child) { 
       if (parent !== child) 
        emit(parent, child); 
       }); 
     }); 
    }, 

    function (key, values) { 
     return { 
      result: Array.from(new Set(values)) 
     }; 
    }, 
    { 
     query: { 
      $where: "this.myArray.length > 1" 
     }, 
     out: "collectionB" 
    }); 

그것은 괜찮 았는데. 문제는 이제 원본 컬렉션에 2 천 1 백 5 십만 문서가 있으며이 예외가 발생합니다.

예외 스레드에서 "풀-3-스레드-5" com.mongodb.MongoCommandException : 서버 로컬 호스트에서 '이을 중첩의 180 개 수준을 초과하기 때문에 문서를 삽입 할 수 없습니다 ' : 명령 오류 15 실패 : 27017. 전체 응답은 { "ok": 0.0, "errmsg": "180 레벨의 중첩으로 문서를 삽입 할 수 없습니다.", "코드": 15, "codeName": "오버플로"} com.mongodb. connection.ProtocolHelper.getCommandFailureException com.mongodb.connection.CommandProtocol.execute (CommandProtocol.java:114)에서 (ProtocolHelper.java:115) 내가 잘못 뭐하는 거지

에서? 이것에 접근하는 올바른 방법은 무엇입니까?

미리 감사드립니다.

답변

1

글쎄, 나는 reduce 함수가 작동하는 방식에 대해 오해가 있었다. 단순한 운 (또는 운이 좋음)에 의해 소량의 데이터로 정상적으로 작동했습니다. 나는지도 함수를 emit (부모, {결과 : [자식]})로 변경했습니다. 그리고 reduce 함수는 다음과 같습니다.

function (key, values) { 
    resultSet = new Set(); 
    values.forEach(function (partialResult) { 
     partialResult.result.forEach(function (elem) { 
      resultSet.add(elem); 
     }); 
    }); 
    return { 
     result: Array.from(resultSet) 
    }; 
} 

은 매력처럼 작동합니다.

관련 문제