2015-01-19 3 views
0

mongoDB에 새 레코드를 저장하는 데 문제가 있습니다. 나는 내가 완전히 이해하지 못하고 누군가가 도울 수 있기를 바라고있는 나의 코드에서 사용하고있는 무언가가 있다는 것을 확신한다.루프에서 MongoDB에 저장

각 고양이에 대해 mongoDB에 새 레코드를 저장하려고합니다. 이 코드는 내가 루프 전에 "고양이"의 값을 기록

for(var x = 0; x < (cats.length - 1); x++){ 
    if (!blocked){ 
     console.log("x = "+x); 
     var memberMessage = new Message(); 
     memberMessage.message = message.message; 
     memberMessage.recipient = room[x].userId; 

     memberMessage.save(function(err){ 
     if (err) console.log(err); 

     console.log(memberMessage + " saved for "+cats[x].name); 
     }); 
    } 
    }); 
} 

Node.js를위한 것이며, 나는 그래서 난 배열을 반복하는 것은 그것을위한 새로운 기록을 저장하는 것이라고 생각 기대하는 모든 이름을받을 수 있나요 각 루프.

나는 데이터베이스를 보면, 모든 루프 사이클 동안 마지막 레코드 만 저장 한 것으로 보입니다. 어떻게/왜 그렇게 할 지 모르겠다.

나는 node.js와 mongoDB를 처음 사용하기 때문에 이에 대한 도움을 주시면 감사하겠습니다.

감사합니다. 당신은 배치를 사용할 수 있습니다

+0

foreach를 사용하면 정상적으로 작동합니다. –

답변

1

. 이제 for 루프가 실제로 동기화됩니다. 이런 식으로 생각해보십시오. JS 엔진은보고있는 각 행을 순차적으로 실행합니다. 이 선들이 한 스택에 하나씩 유지된다고 가정합니다. save의 경우 다른 스택에 그대로 두어 (I/O 작업이므로 시간이 걸립니다) 나머지 루프가 진행됩니다. 그래서 엔진은 이전 스택의 모든 라인을 완료 한 후에 만이 새로운 스택을 확인합니다. 따라서 변수 cats의 값은 배열의 마지막 항목이됩니다. 따라서 마지막 값만 저장됩니다.

는하여 여러개의 방법을 사용할 수 있습니다,이 비극 싸움을하려면

  1. 클로저 - Read More
  2. 약속 - Read More합니다. mongo 드라이버가 작업하기가 더 쉽다고 약속하는 sweet library이 있습니다.
  3. 발전기 등 - Read More. 아직도 황금 시간 동안 준비가되어 있지 않습니다.

주에 대한 # 2 - 나는 프로젝트의 기여 아니지만, 저자와 함께 작동 않습니다. 나는 1 년 넘게 도서관을 사용하고 있으며, 빠르고 멋지다!

2

은 몽구스에서 기능을 만들 :

save 실제로 비동기 인 I/O 작업이기 때문이다
var messages = []; 
for(var x = 0; x < (cats.length - 1); x++) { 
    if (!blocked) { 
     var message = new Message(); 
     message.message = message.message; 
     message.recipient = room[x].userId; 
     messages.push(message); 
    } 
} 

Message.create(messages, function (err) { 
    if (err) // ... 
});