2012-06-28 2 views
0

mapwduce를 실행중인 Mongoid 모델이 여러 개 있습니다. 통합 결과를 단일 daily_stats 모음에 저장하고 싶습니다. 내지도 &이 기능은 모든 3 개 모델에 잘 작동 감소하지만, collection.mapreduce(map, reduce, {:out => "daily_stats", :raw => true})를 통해 출력 할 경우에도, 다음지도의 결과는 작업이 이전 결과를 덮어 감소 심지어 그들이 중복 키가 없습니다 : photos에 대한MongoDB에서 공유 mapreduce 결과 모음

{'_id': "2012-06-01", 'values': {photos: 10}} 
{'_id': "2012-06-02", 'values': {photos: 10}} 

{'_id': "2012-06-01", 'values': {comments: 1}} 
{'_id': "2012-06-02", 'values': {comments: 6}} 

내가 collection.mapreduce(map, reduce, {:out => {:merge => "daily_stats"}, :raw => true})과도 병합했지만, 그 중 하나가 작동하지 않는 것 : 후속 패스가 반환 할 때 밖으로 던져.

아이디어가 있으십니까?

UPDATE

&이 기능 감소지도는 각 모델이 같다 :

지도 :

function() { 
    day = Date.UTC(this.created_at.getFullYear(), this.created_at.getMonth(), this.created_at.getDate()); 
    emit(day, {users: 1}); 
    }; 

가 감소 : 기능 (키, 값) { var에 users_added_count = 0;

{ "_id" : 1337040000000, 
"value" : { 
    "apartments" : 280, 
    "price" : 1003653, 
    "photos" : 83, 
    "comments" : 0 } 
} 
+0

, 당신은하지 않았다 및/또는지도 한 번 줄이고 하나의 문서, 즉 방출 실행할 수없는 이유가 당신의 모델에 비해 그 고유 만들려면 : (일, {사용자 : 1}, {사진 : 1}, {의견 : 1}) emit? – Jenna

+0

아, 알겠습니다. 처음에는 사용자, 사진 및 설명을위한 3 개의 별도 컬렉션이 있습니다. 데이터를 병합하는 방법을 설명하기위한 예제를 작성합니다. – Jenna

+0

입력 데이터 모델 "결과 스키마"의 문서입니까? 죄송합니다. 명확한 설명을 위해 더 많은 데이터 예를 제공해주십시오. – Jenna

답변

1

당신이 감소 맵의 MongoDB를 문서 (보면 http://www.mongodb.org/display/DOCS/MapReduce# :

values.forEach(function(v) { 
     users_added_count += parseInt(v['users']) || 0; 
    }); 

    return {users: users_added_count}; 
    } 

다음 결과 스키마에 대한 몇 가지 추가 정보입니다 MapReduce-Outputoptions)을 사용하면 기본적으로 MR 출력 콜렉션이 동일한 이름을 가진 기존 콜렉션을 대체한다는 것을 알 수 있습니다. "병합"은 새 데이터를 이전 출력 컬렉션에 추가하지만 동일한 키가있는 문서를 덮어 씁니다.

열쇠가 날짜 인 것 같습니다.

{'_id': "2012-06-01", 'values': {photos: 10}} 

{'_id': "2012-06-01", 'values': {comments: 1}} 

동일한 키가있는 경우는 MR을 실행할 때, 두 번째 문서는 첫째 대체합니다. 보다 고유 한 키를 지정하거나 여러 개의 출력 콜렉션을 가져야합니다 (사진 및 주석 중 하나 일 수 있습니다). 당신은 해시 키를 방출 할 수

+0

맞음, 열쇠는 날짜입니다. 같은 키로 항목을 병합 할 방법이 없습니까? '$ addToSet'과 같은 종류의 배열 필드가 있습니까? – Avishai

+0

각 문서에는 고유 한 _id 필드가 있어야하므로 (문서에 고유 색인을 만들고 문서의 위치를 ​​추적하기 위해) 문서를 동일한 키와 병합 할 수 없습니다. 그러나 맵 축소 기능을 포함하는 문제에 대한 해결책이 있다고 생각합니다. MR 기능 및 데이터 스키마에 대한 추가 정보를 제공하면 도움을 줄 수 있습니다. – Jenna

+0

물론,지도를 추가하고 사용자를 위해 줄일 수 있습니다. 다른 모델은 거의 동일합니다. – Avishai

0

emit({day: day, type: '<model class name>'}, 1); 
관련 문제