2017-10-27 33 views
1

重複を避けるためにMongoDBにユニークなインデックスを持っています。Mongodbを使用して重複を避ける方法C++

私は単純なコードをjavaからC++に変換しようとしています ここに私のコードはMongoDBに文書を挿入するコードです。 コードは完璧に動作していますが、同じ文書を挿入しようとするとアプリケーションの動作が停止します。

 mongocxx::client conn{ mongocxx::uri{ "mongodb://localhost:27017" } }; 
    mongocxx::write_concern writeConcern; 
    writeConcern.acknowledge_level(mongocxx::write_concern::level(1)); 

    QFile inputFile(path); 
    if (inputFile.open(QIODevice::ReadOnly)) 
    { 
    QTextStream in(&inputFile); 
    while (!in.atEnd()) 
    { 
     bsoncxx::builder::stream::document document{}; 
     auto collection = conn["TestDB"]["fdevices"]; 
     QString line = in.readLine(); 
     std::string utf8_text = line.toUtf8().constData(); 
     document << "Data" << utf8_text; 

    collection.insert_one(document.view()); 
     } 
    inputFile.close(); 
    } 

ここではjavaで使用したコードを示します。 Javaでは、mongoClient.setWriteConcern(new WriteConcern(0、10));を使用して重複を無視できます。次の文書に私のループを続ける。

MongoClient mongoClient = new MongoClient(asList(new ServerAddress(host+":"+port)), 
     singletonList(MongoCredential.createScramSha1Credential(uname.getText(), 
     MongoClientOptions.builder().serverSelectionTimeout(2000) 
                  .build()); 
     mongoClient.setWriteConcern(new WriteConcern(0, 10)); 
     DB db = mongoClient.getDB(dblist.getSelectedValue().toString()); 
     DBCollection bookCollection = db.getCollection(collectionss.getSelectedValue().toString()); 
     for (int i = 0; i <sixe; i++) { 
      server.prolab.setText("Uploaded files: "+i+" Total files: "+sixe); 
      BasicDBObject doc = new BasicDBObject("Data",dataList.getModel().getElementAt(i)); 
      bookCollection.insert(doc); 
     } 
+1

「writeConcern」は重複とは関係ありません。 '' Duplicate key error ''を受け取っている場合、それは**あなたが挿入しようとしているデータと完全に**関係していて、見る必要があるかもしれません。そのエラーを回避するための「設定」はありません。書き込みの問題を効果的に「火と忘れ」に設定することは本当ですが、データをインポートする場合は、実際に行うべきことではありません。 –

+0

エラーが発生したときに自分のループを続けるという考えは、次の文書がループ内で一意である場合に挿入できるようにする。 –

+0

書き込み時にエラー状態をチェックする必要があります。重複したキーエラーは特に 'E1100'であり、致命的な例外をスローしてスキップすることができますが、これらは本当に"ログ "されていなければなりません。要するに、インポートされたデータが重複キーになった場合、「誰か」が本当にそれを調べるべきです。何かが正しく行われていないため、データソースを修正するかコードプロセスを修正してください。しかし、あなたが間違いを起こしただけで、あなたの頭を砂の中に埋めないでください。 –

答えて

2

正しくwriteConcernメソッドを定義していない場合は、これらのコードを試してください。

mongocxx::client conn{ mongocxx::uri{ "mongodb://localhost:27017" } }; 

     bsoncxx::builder::stream::document document{}; 
     mongocxx::write_concern writeConcern; 
     writeConcern.acknowledge_level(mongocxx::write_concern::level::k_unacknowledged); 
     std::chrono::milliseconds timeout = std::chrono::milliseconds(5000); 
     auto collection = conn["TestDB"]["fdevices"]; 
     collection.write_concern(writeConcern); 
     conn.write_concern(writeConcern); 

QFile inputFile(path); 
if (inputFile.open(QIODevice::ReadOnly)) 
{ 
QTextStream in(&inputFile); 
while (!in.atEnd()) 
{ 
    QString line = in.readLine(); 
    std::string utf8_text = line.toUtf8().constData(); 
    document << "Data" << utf8_text; 
    collection.insert_one(document.view()); 
    } 
inputFile.close(); 
    } 
関連する問題