9

我是 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:序列化器 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 但完成同样的事情?

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

4

1 回答 1

15

使用您使用的新代码,.Insert驱动程序不会批处理这些插入,并且您将获得比InsertBatch.

试试这个:

collection.InsertBatch(documents.Select(d => new BsonDocument(d)));
于 2012-08-22T21:46:57.920 回答