2015-05-07 6 views
7

Ich teste MongoDB (Server v 2.6.7) mit dem C# -Treiber 2.0.MongoDB (Server v 2.6.7) mit C# -Treiber 2.0: So erhalten Sie das Ergebnis von InsertOneAsync

Wenn ich mit der Insert-Funktion InsertOneAsync für ein Dokument mit einem _id, das ich einen Fehler wie das erwarte existiert Sie von der Mongo Shell erhalten:

WriteResult({ 
    "nInserted" : 0, 
    "writeError" : { 
      "code" : 11000, 
      "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.Commands.$_id_ dup key: { : 0.0 }" 
    }}) 

Aber das Problem ist, dass der Einsatz mit dem C# -Treiber keine Ausnahme auslöst und ich den WriteResult für den Einsatz nicht finden kann. Wenn ich in die Datenbank schaue, scheint nichts passiert zu sein.

Also meine Frage ist, was von InsertOneAsync beim Einfügen eines vorhandenen _id zu erwarten?

Der Code in Visual Studio:

IMongoCollection<BsonDocument> commandsCollection = db.GetCollection<BsonDocument>("Commands"); 
var bson = new BsonDocument 
     { 
      {"_id", i.Value}, 
      {"label", i.Key} 
     }; 
commandsCollection.InsertOneAsync(bson); 

Antwort

9

Wenn Sie dies innerhalb eines async tun Methode, dann Brduca Antwort wird funktionieren (und ist bevorzugt), sonst können Sie Wait() auf der Task von derzurückrufenAufruf der Anwendung, um sicherzustellen, bleibt lange genug, um die doppelte Schlüssel Ausnahme zu sehen:

commandsCollection.InsertOneAsync(doc).Wait(); 

Wenn der Einsatz wegen eines doppelten Schlüssels ausfällt, wird die Wait() ein AggregateException werfen, die ein MongoWriteException enthält, die die doppelten Schlüssel Details enthält .

try 
{ 
    commandsCollection.InsertOneAsync(doc).Wait(); 
} 
catch(AggregateException aggEx) 
{ 
    aggEx.Handle(x => 
    { 
     var mwx = x as MongoWriteException; 
     if (mwx != null && mwx.WriteError.Category == ServerErrorCategory.DuplicateKey) 
     { 
      // mwx.WriteError.Message contains the duplicate key error message 
      return true; 
     } 
     return false; 
    }); 
} 

Und falls Sie await verwenden, das wird eine AggregateException auch werfen.

Um die zusätzliche Komplexität der AggregateException Einwickeln der Mongo Ausnahme zu vermeiden, können Sie GetAwaiter().GetResult() statt Wait() nennen:

try 
{ 
    commandsCollection.InsertOneAsync(doc).GetAwaiter().GetResult(); 
} 
catch(MongoWriteException mwx) 
{ 
    if (mwx.WriteError.Category == ServerErrorCategory.DuplicateKey) 
    { 
     // mwx.WriteError.Message contains the duplicate key error message 
    } 
} 
+1

Aber wie erkenne ich den doppelten Schlüssel? InsertOneAsync gibt einen Task ohne Ergebnisteil zurück. Und Wait wird eine Leere zurückgeben. – Fredrik

+1

Danke. Nur noch eine Sache. Wie finde ich die doppelten Schlüsselinformationen in einer MongoWriteException? 'catch (Aggregate e) { e.Handle ((x) => { if (x MongoWriteException) { } return true ist; });' – Fredrik

+0

@Fredrik aktualisiert Antwort See. – JohnnyHK

2

Dies ist ein asynchroner Aufgabe, sind Sie nicht die await

await commandsCollection.InsertOneAsync(bson); 

https://github.com/mongodb/mongo-csharp-driver/blob/master/README.md

+1

Okej, habe ich die Wartezeit hinzugefügt, aber jetzt beendet das C# -Programm nur ruhig, wo die Einfügung ist.Ich möchte eine Ausnahme in mein Gesicht geworfen ^^ – Fredrik

+0

haben Sie versucht, die Sammlung explizit zu speichern? commandsCollection.Save() – Brduca

+1

Leider existiert ein solcher Befehl in der neuen Version des C# -Treibers nicht. [link] (http://stackoverflow.com/questions/29327856/how-to-insert-data-into-a-mongodb-collection-using-c) Die zweite Antwort. – Fredrik

1

Zusätzlich zu @JonnyHK antworten Sie das gleiche tun kann, wenn viele Einfügen.

collection.InsertManyAsync(doc, new InsertManyOptions { IsOrdered = false }).Wait(); 

würde in Versuch/Fang gewickelt werden;

try 
{ 
    collection.InsertManyAsync(doc, new InsertManyOptions { IsOrdered = false }).Wait(); 
} 
catch (AggregateException aggEx) 
{ 
    aggEx.Handle(x => 
    { 
     var mwx = x as MongoBulkWriteException; 
     return mwx != null && mwx.WriteErrors.All(e => e.Category == ServerErrorCategory.DuplicateKey); 
    }); 
} 
0

Ich bin mit VS 2015 und versucht, den ganzen Weg Daten hinzufügen mit InsertOne/InsertOneAsync, aber keine Arbeit.

Code ist hier: // Erstellen Sie ein MongoClient-Objekt mit der Verbindungszeichenfolge _client = new MongoClient();

 //Use the MongoClient to access the server 
     _database = _client.GetDatabase("ratednext"); 

     //get mongodb collection 

     var Collec = _database.GetCollection<BsonDocument>("computers"); 
     var documnt = new BsonDocument 
     { 
      {"Brand","Dell"}, 
      {"Price","400"}, 
      {"Ram","8GB"}, 
      {"HardDisk","1TB"}, 
      {"Screen","16inch"} 
     }; 
     try 
     { 
      Collec.InsertOneAsync(documnt).GetAwaiter().GetResult(); 
     } 
     catch (AggregateException aggEx) 
     { 
      aggEx.Handle(x => 
      { 
       var mwx = x as MongoWriteException; 
       if (mwx != null && mwx.WriteError.Category == ServerErrorCategory.DuplicateKey) 
       { 
        // mwx.WriteError.Message contains the duplicate key error message 
        return true; 
       } 
       return false; 
      }); 
     } 
Verwandte Themen