2014-02-25 2 views
1

단순한지도를 줄여야한다고 생각하지만, 서버 측 JavaScript를 작성하는 방법에 대한 참조를 찾을 수 없기 때문에 문제가 발생했습니다.MongoDB Map-Reduce 동적 스키마와 결합 문서

을 감안할 때 두 문서 :

function() { 
    emit(
     this.atomic,      
     {doc: this.doc, array: this.array} 
    ); 
} 

잘못된 축소 기능은 다음과 같습니다 :

나는 결과를 싶습니다

{ 
    "_id" : ObjectId("530c8b58d95cd926144055d9"), 
    "atomic" : "p", 
    "doc" : { 
    "d1" : "t" 
    }, 
    "array" : ["e"] 
}, 
{ 
    "_id" : ObjectId("530c8b71d95cd926144055da"), 
    "atomic" : "p", 
    "doc" : { 
    "d2" : "r" 
    }, 
    "array" : ["f"] 
} 

는지도 기능이

{ 
    "_id" : "p", 
    "value" : { 
    "doc" : { 
     "d1" : "t", 
     "d2" : "r" 
    }, 
    "array" : ["e", "f"] 
    } 
} 

할 수

function (key, values) { 
var reduced = {doc:{}, array:[]}; 
values.forEach(function(val){ 
    for(var i = 0; i < val.array.length; i++) 
     reduced.array.push(val.array[i]); 
    val.doc.forEach(function(kvp){reduced.doc.add(kvp.key, kvp.value);}); 
}); 
return reduced; 
} 

배열이있는 부분이 좋으므로 엉망인 문서를 결합하려고합니다 (예 : 누락 된 기능으로 인해 실행되지 않음). 내가 생각할 수있는 모든 순열을 시도했다. 배열에 val.doc를 추가하면 모든 것이 나타나고, 하나의 문서로 병합하는 방법을 알 수 없다.

문서의 필드가 동적이어서 이름으로 참조 할 수 없습니다.

도움을 주시면 감사하겠습니다.

답변

1

reduced.doc.add 비트가 작동하는지 확실하지 않습니다.

아마 시도 :

function (key, values) { 
var reduced = {doc:{}, array:[]}; 
values.forEach(function(val){ 
    for(var i = 0; i < val.array.length; i++) 
     reduced.array.push(val.array[i]); 
    for (kvp in val.doc){ 
     reduced.doc[kvp]=val.doc[kvp]; 
    } 
}); 
return reduced; 
} 
+1

뜨아, 내가 노력하지 않은 한 가지. 감사! – mikkelfishman