Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
批量保存到MongoDB C#驱动程序_C#_.net_Mongodb - Fatal编程技术网

批量保存到MongoDB C#驱动程序

批量保存到MongoDB C#驱动程序,c#,.net,mongodb,C#,.net,Mongodb,使用C#驱动程序批量保存MongoDB文档时遇到困难。下面是插入GUID为BsonID的文档的示例代码。一次保存一个是有效的。如果我将文档插入列表并使用save命令,它将失败,并出现“save只能用于具有Id的文档”错误。有什么想法吗 var autolookuplist = new List<BsonDocument>(); Parallel.ForEach(docs, webdoc => {

使用C#驱动程序批量保存MongoDB文档时遇到困难。下面是插入GUID为BsonID的文档的示例代码。一次保存一个是有效的。如果我将文档插入列表并使用save命令,它将失败,并出现“save只能用于具有Id的文档”错误。有什么想法吗

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