MongoDB C#驱动程序 - 如何使用Dictionary of String <String,string =“”> </string,> InsertBatch

时间:2012-08-22 14:43:52

标签: c# mongodb serialization mongodb-.net-driver

我是mongodb + C#司机的新手,请原谅我的任何天真。

我正在尝试对一组键值对进行批量插入,因此我的数据结构类型为List<Dictionary<string,string>>

以下是我的持久性代码示例:

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

我收到有关序列化的错误:

  

MongoDB.Bson.BsonSerializationException:Serializer   DictionarySerializer期望的序列化选项   键入DictionarySerializationOptions,而不是DocumentSerializationOptions。

我错过了设置吗?

编辑:更多信息

我的词典是我的实体。意思是,我只是将它们转储到Dictionary而不是创建一个保存属性的对象。从mongo文档中可以看出,这应该只是转换为mongo Document

进一步编辑:扭曲问题

我可以通过将using语句更改为:

来获取要插入的单个实例
using (server.RequestStart(myDb))
  {
    foreach(var doc in documents)
      collection.Insert(new BsonDocument(doc));
    //var result = collection.InsertBatch(typeof(Dictionary<string, string>), documents);
  }

但是,我关心的是性能,因为在真实情况下我会轻松拥有10k +词典。使用此代码,驱动程序是否足够智能批处理这些代码?有没有办法保持InsertBatch但完成同样的事情?

当然,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:15)

使用使用.Insert的新代码,驱动程序将批量处理这些插入内容,您的性能将大大低于InsertBatch

请改为尝试:

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