2016-08-20 1 views
2

Ich habe gegoogelt und kann keine fundierten Informationen darüber finden, wie doppelte Fehler ignoriert werden, wenn Bulk-Insert verwendet wird.MongoDB Bulk Insert Ignorieren Duplizieren

Hier ist der Code, den ich zur Zeit bin mit:

MongoClient.connect(mongoURL, function(err, db) { 
     if(err) console.err(err) 
     let col = db.collection('user_ids') 
     let batch = col.initializeUnorderedBulkOp() 

     ids.forEach(function(id) { 
     batch.insert({ userid: id, used: false, group: argv.groupID }) 
     }) 

     batch.execute(function(err, result) { 
     if(err) { 
      console.error(new Error(err)) 
      db.close() 
     } 

     // Do some work 

     db.close() 
     }) 
    }) 

Ist es möglich? Ich habe versucht, {continueOnError: true, safe: true} zu bulk.insert(...) hinzuzufügen, aber das hat nicht funktioniert.

Irgendwelche Ideen?

Antwort

2

Eine Alternative ist bulk.find().upsert().replaceOne() stattdessen zu verwenden:

MongoClient.connect(mongoURL, function(err, db) { 
    if(err) console.err(err) 
    let col = db.collection('user_ids') 
    let batch = col.initializeUnorderedBulkOp() 

    ids.forEach(function(id) {   
     batch.find({ userid: id }).upsert().replaceOne({ 
      userid: id, 
      used: false, 
      group: argv.groupID 
     }); 
    }); 

    batch.execute(function(err, result) { 
     if(err) { 
      console.error(new Error(err)) 
      db.close() 
     } 

     // Do some work 

     db.close() 
    }); 
}); 

Mit der oben, wenn ein Dokument die Abfrage { userid: id } entspricht, wird es mit dem neuen Dokument ersetzt werden, sonst wird es daher geschaffen wird, gibt es keine doppelte Schlüsselfehler geworfen.


Für MongoDB-Server-Versionen 3.2 und höher, verwenden bulkWrite als:

MongoClient.connect(mongoURL, function(err, db) { 

    if(err) console.err(err) 

    let col = db.collection('user_ids') 
    let ops = [] 
    let counter = 0 

    ids.forEach(function(id) { 
     ops.push({ 
      "replaceOne": { 
       "filter": { "userid": id }, 
       "replacement": { 
        userid: id, 
        used: false, 
        group: argv.groupID 
       }, 
       "upsert": true 
      } 
     }) 

     counter++ 

     if (counter % 500 === 0) { 
      col.bulkWrite(ops, function(err, r) { 
       // do something with result 
       db.close() 
      }) 
      ops = [] 
     } 
    }) 

    if (counter % 500 !== 0) { 
     col.bulkWrite(ops, function(err, r) { 
      // do something with result 
      db.close() 
     } 
    } 
})