2012-08-22 16 views
9

Soy nuevo en el controlador mongodb + C# así que perdona cualquier ingenuidad en mi parte.Controlador MongoDB C# - Cómo insertar un lote utilizando una lista de diccionario <cadena, cadena>

Estoy intentando hacer una inserción por lotes en una colección de pares clave-valor y, como tal, mi estructura de datos es del tipo List<Dictionary<string,string>>.

He aquí una muestra de mi código de persistencia:

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

consigo un error sobre la serialización:

MongoDB.Bson.BsonSerializationException: Serializador DictionarySerializer espera opciones de serialización de DictionarySerializationOptions tipo, no se DocumentSerializationOptions.

¿Falta la configuración?

EDIT: Más información

Mis diccionarios son mis entidades. Es decir, en lugar de crear un objeto para mantener las propiedades, simplemente las vuelvo a poner en un Dictionary. De la documentación de mongo, parece que esto debería traducirse a un mongo Document.

hacer otras modificaciones: Giro Pregunta

que era capaz de conseguir una única instancia para insertar cambiando la instrucción using a:

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

Sin embargo, mi preocupación es el rendimiento ya que bajo un escenario real Tendré fácilmente 10k + diccionarios. Usando este código, ¿el controlador es lo suficientemente inteligente como para procesar estos? ¿Hay alguna manera de mantener InsertBatch pero lograr lo mismo?

Por supuesto, cualquier ayuda es muy apreciada.

Respuesta

15

utilizar su nuevo código que utiliza .Insert, el conductor no lotes estas inserciones y obtendrá un rendimiento drásticamente más lento que un InsertBatch.

Tal vez puedas probar:

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

Exactamente lo que estaba buscando! ¡Gracias! – OnResolve

Cuestiones relacionadas