2013-08-25 2 views
0

필드가 'State' 인 문서가 있다고 가정하고 다음 문서에서 변경 사항을 감지해야합니다.MongoDB에서 .next()로 colletion의 필드가 변경되었을 때를 감지합니다.

cursor.forEach(
     function(thisCursor){ 
      print('Current: '+thisCursor.State); 
      print('Next: '+cursor.next().State); 
     } 
) 

을하지만 결과는 다음과 같다 : 그 동안, 난 next()와 현재의 커서를 비교하려는

Current: Florida 
Next: Florida 
Current: New Mexico 
Next: New Mexico 

그래서 명확하게 .next() 전혀 작동하지 않습니다. 왜 이런 일이 발생했는지에 대한 아이디어가 있습니까? 당신이 컬렉션을 반복하는 forEach을 사용할 수 있지만

감사

+0

사용중인 플랫폼/프로그래밍 언어는 무엇입니까? – WiredPrairie

+0

그냥 mongoDB 자바 스크립트 명령 줄 – Joss

답변

2

, 당신은 다른 모든 인덱스를 건너 뛰는 끝날 것입니다.

커서는 결과 집합의 한 위치에 불과합니다. forEach은 일반적으로 현재 항목을 다음 항목으로 이동하지만 커서 인스턴스에서 next을 수동으로 호출하면 실수로 콜렉션을 건너 뜁니다. 그것은 결과

> cursor.forEach(function(item){ 
    print("name: " + item.name); 
    print("next name: " + cursor.next().name); }) 

: 나는 forEachnext를 사용하는 경우

> var cursor=db.states.find(); 

:

name: alabama 
next name: alaska 
name: arkansas 
next name: wisconsin 
name: west virginia 
Sun Aug 25 15:04:12.197 error hasNext: false at src/mongo/shell/query.js:124 

으로 당신이 볼 수있는, 그런

> db.states.remove() 
> db.states.insert({name: "alabama"}) 
> db.states.insert({name: "alaska"}) 
> db.states.insert({name: "arkansas"}) 
> db.states.insert({name: "wisconsin"}) 
> db.states.insert({name: "west virginia"}) 

는, 커서를 초기화 커프스 또는 컬렉션을 통해 이동 한 다음 hasNext이 사용되지 않았기 때문에 을 넘어서을 넘어 컬렉션의 길이를 지정합니다.

"다음"문서를 실제로 읽도록 논리를 변경해야하며 다음의 forEach 루프 반복에 영향을 미치지 않아야합니다.

나는 당신의 데이터의 특성을 이해하지 않지만, 당신이 이런 일을 할 수 있습니다 거기에 하나이며, 그것을 비교하는 경우

> var doc=cursor.hasNext() ? cursor.next() : null; 
> while(doc) { 
     var currentDoc=cursor.hasNext() ? cursor.next() : null; 
     if(currentDoc && currentDoc.name === doc.name) { 
      print("matched: " + currentDoc.name); 
     } 
     doc = currentDoc;    
    } 

그것은 하나 개의 문서가, 그 다음 문서를 잡고 페치 첫 번째로. 그런 다음 이전 문서를 현재 문서와 비교하여 반복합니다. 더 이상 문서가 없을 때까지 반복하십시오.

논리가 복잡해지면 Node.JS와 기본 MongoDB 드라이버를 사용해 보시기 바랍니다.

결과가 20 개를 넘으면 배치 크기를 더 크게 설정할 필요가 있습니다. here을 참조하십시오.

관련 문제