2017-10-04 2 views
9

MongoDB 및 Express에서 NodeJS를 사용하고 있습니다. 전자 메일 필드가 필수 인 컬렉션에 레코드를 삽입해야합니다. insertMany 함수를 사용하여 레코드를 삽입하고 있습니다. 고유 한 전자 메일을 삽입 할 때 제대로 작동하지만 중복 전자 메일을 입력하면 작업이 갑자기 중단됩니다.Mongo에서 대량 삽입으로 인한 오류 처리 NodeJS

try catch를 사용하여 오류 메시지를 인쇄했지만 중복 전자 메일을 삽입하자마자 실행이 실패합니다. 실행을 계속하고 복제본을 저장하겠습니다. 삽입/실패한 레코드의 최종 목록을 가져 오려고합니다.

오류 메시지 :

Unhandled rejection MongoError: E11000 duplicate key error collection: testingdb.gamers index: email_1 dup key:  

오류를 처리 할 수있는 방법이 있나요 또는 다른 방법은 insertMany에서 떨어져 있는가?

업데이트 :

이메일 내 컬렉션에 고유 한 필드입니다.

+1

당신이 말한 질문에서 나는 실행을 계속하고 중복 된 것을 저장하기를 원합니다. 그래서 당신은 중복을 저장하거나하지 않으시겠습니까? – alexmac

+0

[Async] (https://www.npmjs.com/package/async) 모듈을 사용하여 문제를 해결했습니다. – Anirudh

답변

0

내가 의견을 할수 없어, 그래서 대답은 간다 : 는 고유 인덱스를 사용하면 데이터베이스 컬렉션이 필드에, 또는 스키마 필드에 고유 한 속성을 가지고? 코드에 대한 자세한 정보를 공유하십시오.

MongoDB를 워드 프로세서에서

:

"등의 _id로, 고유 인덱스의 일부인 키에 대한 중복 값을 삽입하는 것은 예외가 발생합니다 다음 시도는 이미 존재하는 _id 값으로 문서를 삽입 할 수 있습니다. : "이

try { 
    db.products.insertMany([ 
     { _id: 13, item: "envelopes", qty: 60 }, 
     { _id: 13, item: "stamps", qty: 110 }, 
     { _id: 14, item: "packing tape", qty: 38 } 
    ]); 
} catch (e) { 
    print (e); 
} 

은 _id 이후 : (13)가 이미 존재, 다음과 같은 예외가 발생합니다 :

BulkWriteError({ 
    "writeErrors" : [ 
     { 
     "index" : 0, 
     "code" : 11000, 
     "errmsg" : "E11000 duplicate key error collection: restaurant.test index: _id_ dup key: { : 13.0 }", 
     "op" : { 
      "_id" : 13, 
      "item" : "envelopes", 
      "qty" : 60 
     } 
     } 
    ], 
(some code omitted) 

는 도움이되기를 바랍니다.

0

중복 키 삽입으로 인해 오류가 발생한다는 것을 알고 있으므로 개체의 초기 배열을 두 부분으로 나눌 수 있습니다. 하나는 고유 키가 있고 다른 하나는 중복 키가 있습니다. 이렇게하면 조작 할 수있는 복제 목록과 삽입 할 원본 목록이 생깁니다.

let a = [ 
 
    {'email': '[email protected]', 'dude': 4}, 
 
    {'email': '[email protected]', 'dude': 2}, 
 
    {'email': '[email protected]', 'dude': 2}, 
 
    {'email': '[email protected]', 'dude': 1} 
 
]; 
 

 
let i = a.reduce((i, j) => { 
 
    i.original.map(o => o.email).indexOf(j.email) == -1? i.original.push(j): i.duplicates.push(j); 
 
    return i; 
 
}, {'original': [], 'duplicates': []}); 
 

 
console.log(i);

편집

: 난 그냥 깨달았다 키가 이미 DB에 존재하는 경우이 늘 작동합니다. 따라서이 답변을 사용하지 않아야합니다. 그러나 아픈 것은 단지 같은 줄을 따라 생각할 수있는 다른 누군가를위한 참고서로 남겨 둡니다. Nic Cottrell's 답이 맞습니다.

5

첫 번째 오류에서 멈추지 않고 모든 고유하지 않은 문서를 계속 삽입하려면 {ordered:false} 옵션을 insertMany() (예 : insertMany())으로 설정하는 것이 좋습니다.

db.collection.insertMany ( [..., ...], { 은 주문 : 거짓}

the docs에 따르면, 정렬되지 않은 작업이 대기열에 남아있는 모든 쓰기 작업을 처리하기 위해 계속 여전히 BulkWriteError에 오류를 표시) .

관련 문제