2015-01-24 2 views
0

개체 필드에 난수를 할당 한 다음 데이터베이스에 그러한 개체가 있는지 확인해야합니다. 저장하지 않으면 다른 임의의 값을 지정하고 db를 다시 확인하십시오. 나는이 문제가 동시성에 기인하고 그것을 해결하는 방법을 알지 못한다.루프 컨트롤러로 MongoDB 쿼리 결과

while (controller = 0) { 
    var x = Math.floor((Math.random() * 10) + 1); 
    Model.findOne({'x': x}, function(err, result) { 
     if (err) throw err; 
     if (!err && !result) controller = 1; 
     else controller = 0; 
    }); 
} 
+1

귀하의 의도는 무엇입니까? 코드가 * "일치하는 첫 번째 항목을 찾으려고합니다."*처럼 보이지만 더 좋은 방법이 있습니다. 당신은 정말로 무엇을하고 싶습니까? – Tomalak

+0

내 의도는 이미 데이터베이스에 같은 개체가 없다면 데이터베이스에 개체를 저장하고, 값이 있으면 다시 시도하십시오 – qerigan

+0

그래서 완전히 임의의 개체를 데이터베이스에 저장하겠습니까? 무엇 때문에? – Tomalak

답변

1

주의 : 나는 당신의 사건의 세부 사항을 잘 모르겠지만, 당신의 접근 방식이 성능을 크게 줄일 수 있습니다. 특히 난수 값이 큰 MAX_VALUE가 있습니다.

당신에게 비동기 콜백 문제를 해결하기 위해, 당신은 함수를 정의 할 수 있습니다 재귀 호출 :

function saveIfNotExists() { 
    var x = Math.floor((Math.random() * 10) + 1); 
    Model.findOne({'x': x}, function(err, result) { 
     if (err) throw err; 

     if (!result) { 
      // save object here 
     } else { 
      saveIfNotExists(); 
     } 
    }); 
} 
+0

입니다.이 문제를 해결하는 것 같습니다. – qerigan

0

무엇 MongoDB를의 upserts를 사용하는 방법에 대해?

기본적으로 문서의 업데이트가 있으면 업데이트를 수행하고, 그렇지 않으면 새로운 문서를 삽입합니다. 이렇게하면 문서 속성이 존재하는 경우 자체 속성을 업데이트 할 수 있습니다. 그렇지 않으면 값이없는 경우 새 문서로 값을 삽입하십시오.

upserts의 성능에 대해서는 언급 할 수 없지만 처음에는 존재 여부를 확인하고 두 번째로 삽입을 수행하는 데 필요한 것보다 데이터베이스가 적합하다고 생각합니다.

+0

기존 문서를 업데이트하고 싶지 않습니다. 동일한 값을 가진 문서가 있으면 새로운 임의의 값을 가져와 새로운 고유 한 문서로 삽입해야합니다. – qerigan

+0

삽입을 성공적으로 마친 후에 방금 삽입 된 난수가 무엇인지 알아야합니까? – zaSmilingIdiot

+0

아니요, 번호를 삽입하기 전에 번호를 알고 있습니다. – qerigan