2014-03-29 6 views
0

모듈 크래들과 함께 nodejs를 사용하여 couchdb 서버와 상호 작용할 때 질문을 통해 뷰 쿼리를 개선하는 프로세스를 줄일 수 있습니다.couchdb 및 nodejs에서 map/reduce를 사용하여 뷰를 개선하는 방법

예를 들어,이 같은 전망과 함께 자신의 ID로부터 사용자 데이터를 얻어야한다 :

map: function (doc) { emit(null, doc); } 

그리고 Node.js를에을 (크래들) :

db.view('users/getUserByID', function (err, resp) { 
    var found = false; 

    resp.forEach(function (key, row, id) { 
     if (id == userID) { 
     found = true; 
     userData = row; 
     } 
    }); 

    if (found) { 
    //good, works 
    } 
}); 

을 당신이 볼 수 있듯이 , 이건 정말 바야. d는 많은 양의 문서 (데이터베이스의 사용자)를 위해이 뷰를 개선해야하지만 축소 작업은 이해할 수 없기 때문에 어떻게해야할지 모르겠다. 감사합니다.

답변

1

우선 무엇보다도 , 당신은 틀린 시각을하고있다. 보기는 처음부터 색인이므로 전체 스캔 작업에 사용해서는 안됩니다. 이는 효과가없고 잘못되었습니다. key, startkeyendkey 쿼리 매개 변수와 함께 Btree 인덱스의 힘을 사용하고 키 값으로 검색하려는 필드를 내 보냅니다.

db.get(userID, function(err, body) { 
    if (!err) { 
     // found! 
    } 
}); 

루프에 있기 때문에 당신이 당신의 사용자 ID 값 행의 문서 ID를 확인하고 : 두 번째에서

, 당신의 예를 쉽게로 변환 할 수있다. 이 루프는 필요하지 않습니다. 직접 ID로 문서를 요청할 수 있습니다.

function (doc) { emit(doc.userID, null); } 

와 코드가 같은 외모 될 것입니다 : 당신의 사용자 ID 값이 일치하는 문서의 ID가 아닌 경우 세 번째에서

,보기는해야한다

db.view('users/getUserByID', {key: userID}, function (err, resp) { 
    if (!err) { 
     // found! 
    } 
}); 

간단한. 유효한. 빠른. 일치하는 문서가 필요한 경우 include_docs: true 쿼리 매개 변수를 사용하여 가져옵니다.