批量保存到MongoDB C#驱动程序
使用C#驱动程序批量保存MongoDB文档时遇到困难。下面是插入GUID为BsonID的文档的示例代码。一次保存一个是有效的。如果我将文档插入列表并使用save命令,它将失败,并出现“save只能用于具有Id的文档”错误。有什么想法吗批量保存到MongoDB C#驱动程序,c#,.net,mongodb,C#,.net,Mongodb,使用C#驱动程序批量保存MongoDB文档时遇到困难。下面是插入GUID为BsonID的文档的示例代码。一次保存一个是有效的。如果我将文档插入列表并使用save命令,它将失败,并出现“save只能用于具有Id的文档”错误。有什么想法吗 var autolookuplist = new List<BsonDocument>(); Parallel.ForEach(docs, webdoc => {
var autolookuplist = new List<BsonDocument>();
Parallel.ForEach(docs, webdoc =>
{
lock (autolookuplist)
{
autoID++;
var hold = new APAUtoIDGuidLookup() {AutoIncrementID = autoID, ID = webdoc.ID};
autolookuplist.Add(hold.ToBsonDocument());
}
//this works
// idcollection.Save(new APAUtoIDGuidLookup() { AutoIncrementID = autoID, ID = webdoc.ID });
});
//this doesn't work
idcollection.Save(autolookuplist);
更新:
看起来MongoDB不支持批量更新。您不能进行批量保存,但可以进行批量插入
idcollection.InsertBatch(autolookuplist);
谢谢,我考虑过了,但我正在尝试更新收藏。我想我可以删除并插入数据。驱动程序应该支持我正在做的事情(根据方法上的重载)<代码>摘要:将文档保存到此集合。文档必须具有可识别的Id字段。根据Id字段的值,Save将执行插入或更新。当您自己为对象分配Id时,请尝试使用ObjectID而不是BsonID属性。我还发现,循环列表并调用collection.Save对于大型列表非常有效。是的,我正在手动分配Id值(这实际上是来自另一个表的关联)。它们是guid,一次只能使用一个。当此服务器投入生产时,它将处于重载状态(使用EC2 I/O),因此我希望将更新成本降至最低。您已正确引用文档以进行保存。请注意,它并没有说它将保存多个,而是只保存一个。您传递的不是保存文档,而是文档列表。这行不通。正如AliK所说,您应该循环列表,并分别调用Save。您比我更熟悉该产品,但重载允许传递列表。这意味着它应该保存列表,对吗?一个不相关的观察:您正在使用
Parallel.ForEach
,并且您正在通过lock
语句立即同步对autolookuplist
的访问。这没什么意义,还是我遗漏了什么?
idcollection.InsertBatch(autolookuplist);