2014-07-24 2 views
0

언제 그리고 왜 프로젝트에서 커서를 사용합니까? 나는이 모의 코드를Node.js에서 커서를 사용할 때

var mongoClient = require('mongodb').MongoClient; 


mongoClient.connect('mongodb://localhost:27017/tut3',function(err,db){ 
    if(err)throw err; 

    var collection = db.collection('messages'); 


    collection.find({},{_id:true}).each(function(err,doc){ 
     console.log("---- CLASSIC ----") 
     console.dir(doc); 
      //stuff// 
    }); 

    var cursor = collection.find({},{_id:true}); 

    cursor.each(function(err,doc){ 
     console.log("---- CURSOR ----") 
     console.dir(doc); 
     //stuff2 
    }); 

}) 

컬렉션 메시지가있는 경우

예를 들어 크다.

또한 내부 //stuff//stuff2

내가

var cursor = collection.find({},{_id:true}); 

을한다면 나는 모든 문서 (동기)가 언제 커서 수익이 많은 methods을 가지고 있음을 알고 있음을 알고 사이의 서로 다른,하지만 어떤 stuff, 쿼리 완료 및 모든 문서 ...

차이점은 무엇입니까? var cursor 대신 "클래식"find?

+0

"클래식 찾기"란 무엇을 의미합니까? 껍질? 그것도 커서를 반환합니다. 셸이 REPL이라는 사실은 당신이 다음에 당신을 위해 그리고 기본 "배치 크기"25를 가지고 있기 때문에 결과를 곧바로 볼 수있는 이유입니다. –

+0

아니요, 'collection.find ({}, {_ id : true}). each (function (err, doc) {''each'를'query' 안에 넣습니다.} 저는 커서라는 것을 알고 있습니다. 그러나'each '대신에'each'의 차이를 이해하지 못합니다. var 커서 = 쿼리' – Twinsen

답변

1

차이

cursor = collection.find(); 

사이

과 :

collection.find().each(function(err,doc) { 

는 "메소드 체인"이라는 것이 기본적입니다. 실제로 코드 작성 방법에 대한 의견입니다. 따라서 .each()과 같은 메서드로 처리되는 것은 여전히 ​​커서 개체이며 왼쪽에 선택적으로 반환 될 수 있습니다.

또한 "커서"는 이러한 메서드가 호출 될 때까지 아직 "실행"되지 않았습니다. 이것은 다음과 같이 "modifiers"를 아직 실행하지 않고 적용 할 수 있음을 의미합니다.

cursor = cursor.skip(10); 
cursor = cursor.limit(100); 

모든 수정자는 커서도 왼쪽으로 되돌립니다.

이 기본적으로 왼쪽에서 반환되는 어떤 "유형이"오른쪽 "체인"할 수있다 "메소드 체인"에 적용되는 원칙이다 :

collection.find().skip(10).limit(100).each(function(err,doc) { 

당신이 다루고있는 경우 "작은" 결과 세트는 그냥 커서에 .toArray() 메서드를 호출 할 수 있습니다

collection.find({},{_id:true}).toArray(function(err,array) { 
    console.log(array); // everything 
}); 

을하지만 값 1000의 또는 결과의 수백만이있는 경우, 당신은 아마 메모리에 그 모두를로드하지 않습니다. 반복기를 사용하여 처리하는 곳입니다.

collection.find({},{_id:true}).each(function(err,doc) { 
    // do something with the current doc 
}); 

반복은 커서가있는 이유입니다.

+0

완벽한! 감사합니다! 마지막 질문.이 [코드] (http://pastebin.com/bNptQXDU)에서'count '를 체크하면 모든 문서가 반환됩니다. 왜요? ' – Twinsen

+1

@PaulSantone [매뉴얼 페이지] (http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#count)를보십시오. '.count()'는'.count (applySkipLimit, callback)'에서와 같이 두개의 인자를 취합니다. 디폴트 값과 첫 번째 인자가 제공되지 않을 때 일어나는 일은'false'이고 변경자는 적용되지 않습니다. 기본적으로 커서는 아직 실행되지 않았으며'.count()'.each()'.toArray()'와 같은 메소드 만 실제로 실행됩니다. '.count (true, function (err, count) {'모든 수정자를 적용합니다.) –

+0

다시 한번 감사드립니다. – Twinsen

관련 문제