2013-09-30 1 views
3

하나의 요청으로 클라이언트에서 하나 이상의 문서 (JSON 문자열)를 허용하는 동기화 서버 (생각 : SVN)를 개발하려고합니다. (JSON 문자열로 묶인 JS 객체 배열)을 mongodb에 삽입/업데이트하고 각 문서의 삽입/업데이트 상태 (_ mongo의 _id와 같은 정보)를 포함하는 JSON 문자열 인 하나의 응답을 보냅니다.Node.js, MongoDB - 여러 문서 삽입 및 업데이트 및 단일 응답 보내기

하나의 문서 인 경우 하나의 삽입/업데이트를 수행 할 수 있었고 해당 콜백에서 응답을 보낼 수있었습니다.

collection.insert(_data, function(error, result) { 
    if(error) res.send('error'); 
    else res.send(JSON.stringify({result: result})); 
}); 

하지만 두 개 이상의 문서가있는 경우 어떻게해야합니까? 이전 콜백에 하나의 문서를 삽입/업데이트 할 수 있습니다. 그러나 만약 내가 그렇게한다면 나는 두려운 코드의 사다리로 끝날까봐 걱정한다. (나는 하나의 기능으로 그것을 할 수 있고 반복한다.)

도움이 될 것입니다. BTW,이 드라이버를 사용하고 있습니다 : http://mongodb.github.io/node-mongodb-native/

참고 : 처리중인 각 문서는 개별 처리가 필요하므로 일괄 처리 삽입이나 업데이트는 없습니다. 일부는 삽입해야하고 일부는 업데이트해야하며 버전 번호는 &입니다.

답변

5

이 경우 async 모듈을 사용해보십시오. 컬렉션의 각 항목을 처리하는 데 매우 유용한 메소드가 있으며 모든 처리가 완료된 시점의 기능을 제공합니다.

특히 작업을 대기열에 추가 할 수있는 queue 함수를 참조한 다음 모든 항목이 처리 된 후에 수행하십시오. 우리는 당신이라는 변수에 문서의 목록을 가정하면 문서, 당신이 그들 모두를 처리하기 위해 필요한 모든 푸시입니다, 그리고

var q = async.queue(function(task, callback) { 
    // task.doc would contain your individual doc to process 

    // your insert/update logic goes here... 

    // Callback signifies you're done with this task 
    callback(); 

}, 2) // <--- this number specifies the number of tasks to run in parallel 

q.drain = function() { 
    // this is the queue's callback, called when the queue is empty, 
    // i.e. when all your documents have been processed. 

    res.send(statusCode, message); 
} 

:

예를 들어, 당신이 뭔가를 할 수 큐에 넣으십시오.

for (var doc in docs) { 
    q.push({ doc: docs[doc] }, function(err) { 
    if (err) console.log(err); 
    }) 
} 

Protip : 당신은 큐 위에 문서를 포함하는 객체 를 밀어해야합니다. 언 래핑 된 객체를 전달하려고하면 이상한 오류가 발생합니다.

이제 Mongo에서 처리하는 각 문서의 특정 상태를 원한다면 이렇게 할 수 있습니다. 큐 외부에서 데이터 구조를 인스턴스화하는 한 각 항목이 처리 될 때 statusCodes (등)를 추가하고 대기열 드레이브 함수에서 클라이언트에 구조를 전송할 수 있습니다. 너무 많은 번거 로움을해서는 안됩니다.

+1

+1 이것은 정확히 내가 찾고있는 것입니다. 그것이 어떻게되었는지 알려주려고합니다. – techfoobar

+0

완벽하게 작동했습니다. 고맙습니다. – techfoobar

+0

들려서 기쁩니다 :) 비동기는 제가 가장 좋아하는 모듈 중 하나이며, 모든 프로젝트에서 정기적으로 사용됩니다. 이렇게하면 편리합니다. – mattsch

관련 문제