2016-08-20 16 views
2

私は周りを回り、一括挿入を使用して重複エラーを無視する方法についての固い情報を見つけることができません。MongoDB一括挿入重複を無視

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() 
     }) 
    }) 

ことが可能です:

ここで私が現在使用しているコードですか?私はbulk.insert(...){continueOnError: true, safe: true}を追加しようとしましたが、うまくいきませんでした。

アイデア?

答えて

2

の代替ではなく、bulk.find().upsert().replaceOne()使用することです。そうでない場合は作成されます、文書が新しい文書に置き換えられますクエリ{ userid: id }に一致した場合、上記で

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() 
    }); 
}); 

ので、ノーがあります重複キーエラーがスローされます。 MongoDBのサーバーのバージョン3.2以上の場合


、としてbulkWriteを使用します。

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() 
     } 
    } 
})