2010-05-26 3 views
3

MongoDB의 map/reduce 출력 결과는 'counts': {'input': I, 'emit': E, 'output': O}과 같습니다. 내가 설명 할 수없는 이상한 경우를 치기 전까지 그 의미가 무엇인지 분명히 이해했다고 생각했습니다.MongoDB map/reduce counts

내 이해에 따르면 counts.input은 (query에 지정된대로) 조건과 일치하는 행 수입니다. 그렇다면 다음 두 쿼리의 결과가 다른 이유는 무엇입니까?

db.mycollection.find({MY_CONDITION}).count() 

db.mycollection.mapReduce(SOME_MAP, SOME_REDUCE, {'query': {MY_CONDITION}}).counts.input 

동일한 조건이 사용되는 한 두 개는 항상지도와 독립적으로 동일한 결과를 제공해야한다고 생각했습니다.

답변

0

두 통화 사이에 서버가 정상 상태입니까?

+0

예. :) 그리고 내가 얻은 두 개의 숫자는 매우 다르다. 같은 쿼리가 아닐 것 같아. – ibz

+0

hong 소리가 문제가 될 것 같은데 - 이메일 테스트 케이스를 mongodb에 보낼 수 있습니까? - 사용자가 Google 그룹에? – mdirolf

+0

필자는 마감 기한을 지키고 있었고 몇 가지 리포트를 작성 했으므로 코드 품질에 관심이 없었기 때문에 파이썬에서 map/reduce를 시뮬레이션했습니다 (빠르고 정확함이 밝혀졌습니다). 나중에 나는 데이터베이스가 실제로 손상되었다는 것을 발견했다. 아마도 (아마 여러 번 서버를 죽이기 때문이다) 이상한 행동을 설명 할 수있다. 더 이상 재현 할 수 없을 것이라고 생각하지 마십시오. 어쨌든 고마워. :) – ibz

3

map/reduce 패턴은 SQL의 그룹 기능과 같습니다. 따라서 결과를 한 행에 그룹화합니다. 그래서 당신은 같은 수의 결과를 가질 수 없습니다.

mapReduce() 메소드의 수는 map/reduce 함수 이후의 결과 수입니다.

예를 들면. 당신은 2 개 행이 있습니다

{'id':3,'num':5} 
{'id':4,'num':5} 

을 그리고 당신은 당신이 2 행 얻을이지도 기능 후지도 기능

function(){ 
    emit(this.num, 1); 
} 

에게 적용 방법을 줄일

{5, 1} 
{5, 1} 

을 그리고 지금 당신이 당신을 적용

function(k,vals) { 
    var sum=0; 
    for(var i in vals) sum += vals[i]; 
    return sum; 
} 

이제 1 행 반환 :

2 
+0

map/reduce가 무엇인지 압니다. 제가 말했듯이, '카운트'는 숫자가 아니라, '입력'이라는 멤버가 포함 된 사전입니다. MongoDB 문서에 따르면, 이것은 "스캔 된 객체의 수"입니다. 이제 내 질문은 -이 조건이 조건과 일치하는 개체의 수와 같습니까? 아니면 내가 고려해야 할 다른 것이 있습니까? 제 질문을 다시 읽어 보시고 충분히 명확하지 않으면 개선 방법을 알려주십시오. :) – ibz