2012-08-09 4 views
1

MongoHQ에서 실행되는 mongodb와 내 자신의 개발 시스템에서 실행되는 버전 사이에 이상한 차이가 있습니다. 맵리 듀스지도 기능 내부 개체 ID에 .toString()를 호출 할 때 특히, 결과는 다를 수 : MongoHQ에이상한 MongoDB MapReduce ObjectId.toString() 비헤이비어?

ObjectId('foo').toString() // => 'foo' 

:

ObjectId('foo').toString() // => 'ObjectId(\'foo\')' 

참고 : 내 자신의 시스템에서

는 ID의이 내가 사용하는 실제 몽고블 ID는 - 단지 'foo'등이 아닙니다.

예상 할 수있는 것은입니다.은 내 컴퓨터에서와 같이 작동합니다. MongoHQ에서는 작동하지 않습니다. 어떻게 오지? MongoDB를 내 로컬 OSX 버전 브루를 사용하여 설치 실제로 내가 약간의 테스트 케이스를 구축했습니다, 무슨 일이 일어나고 있는지 보여주기 위해 버전 2.0.1-x86_64

입니다

. 의 사용자 ID의 배열되고, 우리는 friends 속성을 가진 users 컬렉션이 있다고 가정 해 봅시다 :

> db.users.find() 
{ _id: ObjectId('a'), friends: [ObjectId('b'), ObjectId('c')] }, 
{ _id: ObjectId('b'), friends: [] }, 
{ _id: ObjectId('c'), friends: [] } 

bc으로 사람과 친구가되지 않습니다 어디 ab과 친구와 c입니다 볼 수 있듯이. 이제

의가 작동 테스트 알고리즘을 살펴 보자 :

var map = function() { 
    this.friends.forEach(function(f) { 
    emit(f, { friends: 1, user: user, friend: f.toString() }); 
    }); 
}; 

var reduce = function(k, vals) { 
    var result = { friends: 0, user: [], friend: [] }; 

    vals.forEach(function(val) { 
    result.friends += val.friends; 
    result.user.push(val.user); 
    result.friend.push(val.friend); 
    }); 

    return result; 
}; 

var id = ObjectId('50237c6d5849260996000002'); 

var query = { 
    query : { friends: id }, 
    out  : { inline: 1 }, 
    scope : { user: id.toString() }, 
    jsMode : true, 
    verbose : true 
}; 

db.users.mapReduce(map, reduce, query); 

users 컬렉션 누군가의 친구 인 사용자의 ID로 설정 id를 가정하면, 출력은 mapReduce 메소드에 의해 반환 당신이 볼 수 있듯이

{ 
    "results" : [ 
    { 
     "_id" : ObjectId("50237c555849260996000001"), 
     "value" : { 
     "friends" : 1, 
     "user" : "50237c6d5849260996000002", 
     "friend" : "ObjectId(\"50237c555849260996000001\")" 
     } 
    }, 
    { 
     "_id" : ObjectId("50237c74c271be07f6000002"), 
     "value" : { 
     "friends" : 1, 
     "user" : "50237c6d5849260996000002", 
     "friend" : "ObjectId(\"50237c74c271be07f6000002\")" 
     } 
    } 
    ], 
    "timeMillis" : 0, 
    "timing" : { 
    "mapTime" : 0, 
    "emitLoop" : 0, 
    "reduceTime" : 0, 
    "mode" : "mixed", 
    "total" : 0 
    }, 
    "counts" : { 
    "input" : 1, 
    "emit" : 2, 
    "reduce" : 0, 
    "output" : 2 
    }, 
    "ok" : 1, 
} 

는 각 결과의 friend 속성이 ID를 포함하는 단순한 문자열이 아니라 실제를 포함하는 문자열을 충족 : MongoHQ에 다음과 같이 표시됩니다 호드 콜.

내가 내 자신의 컴퓨터에서이 작업을 실행나요, 결과 배열은이었을 것입니다 : 당신이보다

{ 
    "_id" : ObjectId("50237c555849260996000001"), 
    "value" : { 
    "friends" : 1, 
    "user" : "50237c6d5849260996000002", 
    "friend" : "50237c555849260996000001" 
    } 
}, 
{ 
    "_id" : ObjectId("50237c74c271be07f6000002"), 
    "value" : { 
    "friends" : 1, 
    "user" : "50237c6d5849260996000002", 
    "friend" : "50237c74c271be07f6000002" 
    } 
} 

답변

1

MongoHQ가 MongoDB를의 다른 버전을 실행 중입니다.

var map = function() { 
    this.friends.forEach(function(f) { 
    emit(f, { friends: 1, user: user.str, friend: f.str }); 
    }); 
}; 
:

당신의 사제 버전의 동작을 얻으려면,지도 기능을 변경해보십시오
관련 문제