2012-08-22 10 views
9

Jestem nowy dla mongodb + C# kierowcy, więc wybaczcie każdą naiwność na moim końcu.Sterownik MongoDB C# - Jak wstawić listę używając słownika <ciąg, ciąg>

Próbuję wykonać wsadowe wsadowe w zbiorze par klucz-wartość i jako takie moja struktura danych jest typu List<Dictionary<string,string>>.

Oto próbka mojego kodu trwałości:

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

pojawia się błąd o serializacji:

MongoDB.Bson.BsonSerializationException: serializer DictionarySerializer spodziewać opcje serializacji typu DictionarySerializationOptions, nie DocumentSerializationOptions.

Czy brakuje ustawień?

EDIT: Więcej informacji

Moi słowniki są moje podmioty. Oznacza to, że zamiast tworzyć obiekt do przechowywania właściwości, po prostu zrzucam je do postaci Dictionary. Z dokumentacji mongo wynika, że ​​powinno to być przetłumaczone na mongo Document.

INNE EDIT: Twist Pytanie

I był w stanie uzyskać pojedynczą instancję wstawić zmieniając przy użyciu oświadczenie:

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

Jednak moim problemem jest wydajność ponieważ w prawdziwym scenariuszu Z łatwością będę mieć 10k + słowniki. Używając tego kodu, czy kierowca jest wystarczająco inteligentny, aby je wsypać? Czy istnieje sposób na utrzymanie InsertBatch, ale osiągnąć to samo?

Oczywiście każda pomoc jest doceniana.

Odpowiedz

15

Korzystanie nowy kod, który używa .Insert, kierowca nie partii tych płytek, a dostaniesz znacznie mniejszą wydajność niż InsertBatch.

Spróbuj to zamiast:

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

Dokładnie to, czego szukasz! Dziękuję Ci! – OnResolve

Powiązane problemy