2011-11-23 3 views
0

mapreduce를 실행하는 데 필요한 대규모 데이터 세트 (약 1.1M 문서)가 있습니다.MongoDB : _id는 배열이 될 수 없다

그룹화 할 필드는 xref라는 이름의 배열입니다. 컬렉션의 크기와 32 비트 환경에서이 작업을 수행한다는 사실 때문에 새 데이터베이스의 다른 컬렉션으로 컬렉션을 축소하려고합니다. 여기

{ "_id" : ObjectId("4ec6d3aa61910ad451f12e01"), 
"bii" : -32.9867, 
"class" : 2456, 
"decdeg" : -82.4856, 
"lii" : 297.4896, 
"name" : "HD 22237", 
"radeg" : 50.3284, 
"vmag" : 8, 
"xref" : ["HD 22237", "CPD -82 65", "-82 64","PPM 376283", "SAO 258336", 
      "CP-82 65","GC 4125" ] } 

{ "_id" : ObjectId("4ec6d44661910ad451f78eba"), 
    "bii" : -32.9901, 
    "class" : 2450, 
    "decdeg" : -82.4781, 
    "decpm" : 0.013, 
    "lii" : 297.4807, 
    "name" : "PPM 376283", 
    "radeg" : 50.3543, 
    "rapm" : 0.0357, 
    "vmag" : 8.4, 
    "xref" : ["HD 22237", "CPD -82 65", "-82 64","PPM 376283", "SAO 258336", 
      "CP-82 65","GC 4125" ] } 

{ "_id" : ObjectId("4ec6d48a61910ad451feae04"), 
    "bii" : -32.9903, 
    "class" : 2450, 
    "decdeg" : -82.4779, 
    "decpm" : 0.027, 
    "hd_component" : 0, 
    "lii" : 297.4806, 
    "name" : "SAO 258336", 
    "radeg" : 50.3543, 
    "rapm" : 0.0355, 
    "vmag" : 8, 
"xref" : ["HD 22237", "CPD -82 65", "-82 64","PPM 376283", "SAO 258336", 
      "CP-82 65","GC 4125" ] } 

(오른쪽 지금은 LII와 BII 필드 해요)지도하고 기능을 감소 :

function map() { 
try { 
    emit(this.xref, {lii:this.lii, bii:this.bii}); 
} catch(e) { 
} 
} 

function reduce(key, values) { 

var result = {xref:key, lii: 0.0, bii: 0.0}; 
try { 
    values.forEach(function(value) { 

     if (value.lii && value.bii) { 
      result.lii += value.lii; 
      result.bii += value.bii; 
     } 
    }); 

    result.bii /= values.length; 
    result.lii /= values.length; 
} catch(e) { 
} 

return result; 
} 

불행하게도, 결국이 실행

먼저, 여기에 데이터 샘플입니다

db.catalog.mapReduce(map, reduce, {out:{replace:"catalog2", db:"astro2"}}); 

Wed Nov 23 10:12:25 uncaught exception: map reduce failed:{ 
    "assertion" : "_id cannot be an array", 
    "assertionCode" : 10099, 
    "errmsg" : "db assertion failure", 
    "ok" : 0 

xref 필드는 배열이지만 모든 값은 해당 arr에서 동일합니다. 찬성. 그 배열을 새 컬렉션의 id 필드로 사용하려고합니까?

답변

5

예 인덱싱을위한 특별한 동작이 있으므로 _id를 배열로 설정할 수 없습니다. 출력 할 키는 출력 컬렉션에서 _id로 사용됩니다. 결과가 작 으면 콜렉션으로 이동하지 않으므로 "인라인"출력 모드에서만 작동합니다. 하지만 이상적으로 배열을 문자열로 변환하고 (예 : 값을 연결) _id로 사용하거나 배열 대신 하위 개체로 만듭니다.

reduce 함수의 결과에는 키가 포함되지 않아야합니다. {lii : .., bii : ..}

관련 문제