2010-07-20 1 views
10

Mongo MapReduce를 사용하여 여러 문서에서 단어 수 계산을 수행하고 있습니다. 문서는 (그냥 ID와 단어의 해시) 매우 간단하다 :MongoDB MapReduce가 PHP에서 데이터를 반환하지 않습니다.

{ "_id" : 6714078, "words" : { "my" : 1, "cat" : 1, "john" : 1, "likes" : 1, "cakes" : 1 } } 
{ "_id" : 6715298, "words" : { "jeremy" : 1, "kicked" : 1, "the" : 1, "ball" : 1 } } 
{ "_id" : 6717695, "words" : { "dogs" : 1, "can't" : 1, "look" : 1, "up" : 1 } } 

데이터베이스는 X가 카테고리 번호 (이다, 문제의 컬렉션은 "wordsX"라는되어 내 환경에서 "단어"라고합니다 나는 알고있다, 묻지 않는다). 단어가 저장되는 문서 해시의 필드 이름도 "단어"입니다. 가.

내가 갖고있는 문제는 내 PHP 응용 프로그램의 특정 조건에서 MapReduce가 데이터를 반환하지 않는다는 것입니다. 귀찮아, Mongo 셸에서 같은 명령을 실행하면 완벽한 결과를 얻을 수 있습니다. 나는이 버그가 어디에서 발생했는지 파악하려고 노력하고 있지만 정말 곤란하다. 그래서 누군가가 이것에 대해 밝힐 수 있기를 바란다. 이 질문에 대한 리드 업은 약간 복잡합니다. 환경이 약간 복잡하기는하지만, 저를 참아주십시오.

이 임시 수집 결과
m = function() { 
    if (this.words) { 
     for (index in this.words) { 
      emit(index, this.words[index]); 
     } 
    } 
} 
r = function (key, values) { 
    var total = 0; 
    for (var i in values) { 
     total += values[i]; 
    } 
    return total; 
} 
res = db.words.mapReduce(m, r, { query : { _id : { $in : [6714078,6715298,6717695] } } }); 

단어 카운트 데이터를 포함하는 생성되는 다음과 같이 나는 PHP 기반 작업을 복제 할 몽고 쉘에서 실행 해봤

명령입니다. 지금까지 OK.

그러나 PHP에서 동일한 명령을 실행하면 (표준 Mongo 라이브러리 사용) 특정 조건에서 데이터가 없습니다. Mongo를 넘어서는 애플리케이션/환경에 대한 자세한 설명을 원하지 않기 때문에 설명하기가 약간 까다 롭습니다.하지만 기본적으로 Sphinx를 사용하여 일부 레코드를 필터링 한 다음 Mongo에 컨텐츠 ID 목록을 제공합니다. MapReduce가 수행됩니다. 2 ~ 3 일 후에 데이터를 다시 필터링하면 Mongo에서 결과를 얻습니다. 필터링하지 않으면 빈 데이터 집합이 다시 나타납니다. 같은 작업을 실행하는 PHP 코드는 다음과 같습니다. 나는 Sphinx 기반의 부분을 포함하지 않았다. 내가 관련성이 있다고 생각하지 않는다. (단지 ID의 목록을 얻는다는 것을 안다.) 명령 행에서 Mongo와 똑같은 목록을 공급하려했기 때문이다. 올바른 결과를 얻지 만, PHP에서는 그렇지 않습니다. 희망은 그 말이 맞습니다.

PHP 코드 I는 다음과 같다을 사용하고 있습니다 : 결과 - 정보 배열 ($arrStatsInfo)의

$objMongo = new Mongo(); 
$objDB = $objMongo->words; 

$arrWordList = array(); 

$strMap = ' 
    function() { 
     if (this.words) { 
      for (index in this.words) { 
       emit(index, this.words[index]); 
      } 
     } 
    } 
'; 

$strReduce = ' 
    function(key, values) { 
     var total = 0; 
     for (var i in values) { 
      total += values[i]; 
     } 
     return total; 
    } 
'; 

$objMapFunc = new MongoCode($strMap); 
$objReduceFunc = new MongoCode($strReduce); 
$arrQuery = array(
    '_id' => array('$in' => $arrIDs) // <--- list of IDs from Sphinx 
); 
$arrCommand = array(
    'mapreduce' => 'wordsX', 
    'map' => $objMapFunc, 
    'reduce' => $objReduceFunc, 
    'query' => $arrQuery 
); 

MongoCursor::$timeout = -1; 

$arrStatsInfo = $objDB->command($arrCommand); 

var_dump($arrStatsInfo); 

내용 작동 및 비 작동 조건 (위의 지정된 필터링) 아래에 다음과 같이 .

근무 결과 :

array(4) { 
    ["result"]=> 
    string(31) "tmp.mr.mapreduce_1279637336_227" 
    ["timeMillis"]=> 
    int(171) 
    ["counts"]=> 
    array(3) { 
    ["input"]=> 
    int(54) 
    ["emit"]=> 
    int(2517) 
    ["output"]=> 
    int(1526) 
    } 
    ["ok"]=> 
    float(1) 
} 

빈 결과 :

array(4) { 
    ["result"]=> 
    string(31) "tmp.mr.mapreduce_1279637381_228" 
    ["timeMillis"]=> 
    int(21) 
    ["counts"]=> 
    array(3) { 
    ["input"]=> 
    int(0) 
    ["emit"]=> 
    int(0) 
    ["output"]=> 
    int(0) 
    } 
    ["ok"]=> 
    float(1) 
} 

그래서 그것이 깨진 상태에서 보이는, 아무 기록도 맵리 듀스로하지 않습니다. 나는이 지구에서 일어나는 일을 해결하기 위해 노력한 나이를 보냈지 만, 지금까지는 통찰력이 없었습니다. 앞서 말했듯이 정확히 동일한 ID 세트를 사용하여 Mongo 명령 줄에서 똑같은 명령을 실행하면 (위와 같이) 올바른 결과가 반환됩니다.

결국, 내 질문은 짐작할 수 있습니다. 위에 언급 한 PHP 몽고와의 상호 작용에 분명히 잘못된 점이 있습니까? 이 디버깅을 시도 할 수있는 다른 단계가 있습니까?

추가 정보를 제공하면 도움이 될 것입니다. 이 질문이 다소 광범위하고 잘못 정의되어 있지만 감사의 말을 전하고 싶습니다. 누군가가이 문제를 해결할 수 있기를 바랍니다.

많은 감사를드립니다!

+3

이 버그가있는 동작은 실제로 응용 프로그램의 다른 곳에서 코드 결과로 나타났습니다 (놀랍게도 놀랍습니다). 데이터베이스에 문서를 삽입하는 두 가지 루틴이있었습니다. 하나는 큰 배치에서 실행되었고 다른 하나는 점진적으로 실행되었습니다. 하나는 숫자 문자열을 ID로 사용하고 다른 하나는 정수를 사용했습니다. 그들은 한 눈에 똑같이 보였지만 사실은 다른 문서를 만들었습니다! 이제는 명시 적 int 캐스팅을 모든 곳에서 사용했습니다 (당연히해야했던 것처럼). 이제는 모두 정상입니다. 이야기의 도덕적 인면은 int와 숫자 문자열을 구별 할 수 있어야합니다! :) – BigglesZX

+0

이 질문에 대한 직접적인 대답은 아니지만 [mongodb-user] (http://groups.google.com/group/mongodb-user?hl=ko) 목록에 대한 질문을 해보시기 바랍니다. - PHP 라이브러리의 바인딩에 버그가있을 수 있으며, MongoDB 직원은 일반적으로 질문 및 버그 리포트에 신속하게 응답합니다. 이 목록은 IMHO에 게시하는 것보다 도움을 줄 가능성이 큽니다. –

+1

아, 코드를 읽으면서 읽으시기 바랍니다. 제 추측이었습니다. :) 아마도 투표를 닫아서 질문을 끝내거나 직접 대답해야합니다. –

답변

0

향후 독자를 위해이 문제는 응용 프로그램의 다른 곳에서 정수/숫자 문자열을 일관성없이 처리 한 결과입니다. 빨간 청어를 유감스럽게 생각합니다!