我是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但完成同样的事情?
当然,非常感谢任何帮助。
答案 0 :(得分:15)
使用使用.Insert
的新代码,驱动程序将不批量处理这些插入内容,您的性能将大大低于InsertBatch
。
请改为尝试:
collection.InsertBatch(documents.Select(d => new BsonDocument(d)));