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: [] }
b
및 c
으로 사람과 친구가되지 않습니다 어디 a
이 b
과 친구와 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"
}
}