2012-08-22 20 views
9

Ben mongodb + C# sürücüsüne yeni geldim, bu yüzden sondaki herhangi bir naifliği affet.MongoDB C# Sürücü - Bir Sözlük Listesini Kullanarak InsertBatch Nasıl Kullanılır <string, string>

Bir grup anahtar/değer çiftleri kümesinde toplu iş eki yapmaya çalışıyorum ve bu nedenle veri yapım List<Dictionary<string,string>> türünde. Ben serileştirme bir hata aldınız

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

: Burada

benim kalıcılık kod örneği verilmiştir

MongoDB.Bson.BsonSerializationException: Serializer DictionarySerializer, tip DictionarySerializationOptions ait seri hale seçenekleri beklenmemektedir DocumentSerializationOptions.

Ayarları kaçırıyor muyum?

DÜZENLEME: Daha Fazla Bilgi

Benim sözlükleri benim varlıklardır. Anlam, özellikleri tutmak için bir nesne oluşturmak yerine, onları bir Dictionary içine döküyorum. Mongo belgelerinden, bu sadece bir mongo Document çevirmelidir gibi görünüyor.

FAZLA DÜZENLEME:

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

Ancak benim endişem gerçek senaryo altında beri performanstır: Çevirme Soru

Ben kullanarak ifadeyi değiştirerek eklemek için tek bir örneğini elde edebildi Kolayca 10k + sözlüklerim olacak. Bu kodu kullanarak, sürücü bunları toplu halde çalıştıracak kadar akıllı mı? InsertBatch'i tutmanın bir yolu var mı ama aynı şeyi mi yapıyorsunuz?

Elbette, herhangi bir yardım çok takdir edilmektedir.

cevap

15

.Insert, sürücü will değil toplu bu uçlar kullanan yeni kodu kullanarak ve bir InsertBatch daha büyük ölçüde düşük performans alırsınız.

yerine bu deneyin:

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

aradığım Tam olarak ne! Teşekkür ederim! – OnResolve

İlgili konular