2017-05-10 1 views
2

.forEach()을 사용하여 여러 사용자 세부 정보를 내 Mongodb 데이터베이스에 삽입하고 싶습니다. 레코드를 삽입하기 전에 사용자 레코드가 존재하는지 확인하고 싶습니다. 사용자가 존재하지 않으면 새로운 사용자 레코드를 삽입하십시오. 그렇지 않으면 기존 사용자 레코드를 업데이트하십시오..forEach()를 사용하여 여러 모음을 삽입하는 방법 및 존재 여부 확인

다음은 배열에서, 자사의 확인에만 첫 번째 개체를이 코드를 실행하고 내 DB에 삽입 할 때

var dataArray=[ 
     {"id":"1","name":"abc","email":"[email protected]"}, 
     {"id":"2","name":"xyz","email":"[email protected]"}, 
     {"id":"1","name":"abc","email":"[email protected]"}, 
     ]; 

dataArray.forEach(function(dataVar){ 

//check record exist or not 

User.findOne({id:dataVar.id},function(err,user){ 
    if(!user){// Insert If user not exist 
     var userSchema=new User({ 
      id:dataVar.id, 
      name:dataVar.name, 
      email:dataVar.email 
     }); 
     userSchema.save(function(err,result){ 
     console.log('New Record Inserted');  
     }) 
    }else{ // Update records if user exist 
     User.update({id:dateVar.id},{email:dataVar.email},function(err,result){ 
     console.log('Record Updated');;  
     }); 
    } 
}) 
}); 

입니다. 그러나 다음 번에 세 번째 객체가 실행될 때 새 레코드와 같은 검사 및 삽입이 수행되지 않습니다.

나는 무슨 일이 일어나지 않을거야.

해결 방법을 알려주십시오.

감사합니다.

+0

당신은'forEach'를 사용하여 반복 배열에 동기화 작업과 비동기 혼합된다. 비동기 적으로 반복해야합니다. [async] (https://github.com/caolan/async) 라이브러리를 확인하십시오.이 라이브러리는 제어 흐름 (비동기 작업)을 위해 만들어졌으며 배열 요소에 대한 많은 메소드가 있습니다. 여기에는 async.forEach (arr, iterator, callback) 메소드가 필요할 것이다. – chridam

+0

이제'async'로 작업합니다. .. 고마워요 –

답변

2

당신은

참조 비동기 루프를 수행해야합니다 https://caolan.github.io/async/docs.html#eachOfSeries

예제 코드

var dataArray = [{ 
    "id": "1", 
    "name": "abc", 
    "email": "[email protected]" 
}, { 
    "id": "2", 
    "name": "xyz", 
    "email": "[email protected]" 
}, { 
    "id": "1", 
    "name": "abc", 
    "email": "[email protected]" 
}, ]; 

async.eachOfSeries(dataArray, function(dataVar, key, callback) { 
    User.findOne({ 
     id: dataVar.id 
    }, function(err, user) { 
     if (!user) { // Insert If user not exist 
      var userSchema = new User({ 
       id: dataVar.id, 
       name: dataVar.name, 
       email: dataVar.email 
      }); 
      userSchema.save(function(err, result) { 
       console.log('New Record Inserted'); 
       callback(); 
      }) 
     } else { // Update records if user exist 
      User.update({ 
       id: dateVar.id 
      }, { 
       email: dataVar.email 
      }, function(err, result) { 
       console.log('Record Updated');; 
       callback(); 
      }); 
     } 
    }) 
}, function(err) { 
    if (err) console.error(err.message); 
    // configs is now a map of JSON data 
    console.log("All done") 
}); 
+0

고마워, 지금은 작동 중 ....... 내가 알고 싶은 한가지, 내 배열에 5k + 개체가 있다면 사용하는 것이 좋을까요? –

+0

이 작업은 효과가 있지만 배열을 사전 처리하여 각 개체의 고유 ID가있는 배열로 끝날 수 있습니다. (따라서 배열을 반복하고 새 값 (또는 키 - 값 객체)을 만들고 객체에 'update'를 적용하십시오.) 이렇게하면 DB/비동기 작업이 훨씬 적어집니다. –