2012-08-22 10 views
9

Ich bin neu bei mongodb + C# -Treiber so verzeihen Sie jede Naivität an meinem Ende.MongoDB C# Treiber - How to InsertBatch mit einer Liste von Dictionary <string, string>

Ich versuche, eine Batch-Einfügung auf eine Sammlung von Schlüssel-Wert-Paaren zu machen, und als solche ist meine Datenstruktur vom Typ List<Dictionary<string,string>>.

Hier ist eine Probe meiner Ausdauer Code:

public void Persist(string collectionName, List<Dictionary<string, string>> documents) 
{ 
    string connectionString = ConfigurationManager.ConnectionStrings[CONNECTION_STRING_KEY].ConnectionString; 
    MongoServer server = MongoServer.Create(connectionString); 
    MongoCredentials credentials = new MongoCredentials("MYUser", "MyPassword"); 
    MongoDatabase myDb = server.GetDatabase("myDb", credentials); 

    var collection = myDb .GetCollection(collectionName); 

    using (server.RequestStart(myDb)) 
    { 
    var result = collection.InsertBatch(documents); 
    } 
} 

ich eine Fehlermeldung über die Serialisierung erhalten:

MongoDB.Bson.BsonSerializationException: Serializer DictionarySerializer erwartet Serialisierungsoptionen von Typ DictionarySerializationOptions, nicht DocumentSerializationOptions.

Fehle ich Einstellungen?

EDIT: Weitere Informationen

Meine Wörterbücher meine Entitäten sind. Bedeutung, anstatt ein Objekt zu erstellen, um Eigenschaften zu halten, lasse ich sie einfach in eine Dictionary. Aus der Mongo-Dokumentation scheint es, dass dies nur zu einem Mongo Document übersetzt werden sollte.

WEITERE EDIT: Twist Frage

konnte ich eine einzelne Instanz erhalten, indem Sie die Anweisung using einfügen zu:

using (server.RequestStart(myDb)) 
    { 
    foreach(var doc in documents) 
     collection.Insert(new BsonDocument(doc)); 
    //var result = collection.InsertBatch(typeof(Dictionary<string, string>), documents); 
    } 

aber meine Sorge Leistung, da unter einem realen Szenario Ich werde leicht 10k + Wörterbücher haben. Ist der Treiber mit diesem Code intelligent genug, um diese zu chargen? Gibt es eine Möglichkeit, InsertBatch beizubehalten, aber dasselbe zu erreichen?

Natürlich wird jede Hilfe sehr geschätzt.

Antwort

15

Arbeiten mit dem neuen Code, der .Insert verwendet, wird der Fahrer nicht Batch diese Einsätze und Sie werden drastisch geringere Leistung als ein InsertBatch bekommen.

Versuchen Sie stattdessen:

collection.InsertBatch(documents.Select(d => new BsonDocument(d))); 
+1

Genau das, was ich gesucht habe! Vielen Dank! – OnResolve

Verwandte Themen