Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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
c#Mongodb 2.0驱动程序获取UpdateManaySync结果_C#_Mongodb_Mongodb .net Driver_Mongodb Csharp 2.0 - Fatal编程技术网

c#Mongodb 2.0驱动程序获取UpdateManaySync结果

c#Mongodb 2.0驱动程序获取UpdateManaySync结果,c#,mongodb,mongodb-.net-driver,mongodb-csharp-2.0,C#,Mongodb,Mongodb .net Driver,Mongodb Csharp 2.0,有没有办法在更新后/之前获取更新的集合? 我能想到的东西很重 使用筛选器获取要更新的内容 更新我在前一个状态中得到的所有信息 再次获取所有ID,并检查已更新的内容 为什么我需要这个 我有一个不断从数据库获取数据的服务。 我希望它能根据他们的状态,原子化地接收东西 例如,如果包含字段Status的文档的状态为1,我希望服务获取该文档,并在过程中将其自动更改为2,这样其他所有组件都不会出于某种原因覆盖我 更新看起来像: var filter = Builders<ServiceModel>

有没有办法在更新后/之前获取更新的集合? 我能想到的东西很重

  • 使用筛选器获取要更新的内容
  • 更新我在前一个状态中得到的所有信息
  • 再次获取所有ID,并检查已更新的内容
  • 为什么我需要这个

    我有一个不断从数据库获取数据的服务。 我希望它能根据他们的状态,原子化地接收东西

    例如,如果包含字段Status的文档的状态为1,我希望服务获取该文档,并在过程中将其自动更改为2,这样其他所有组件都不会出于某种原因覆盖我

    更新看起来像:

    var filter = Builders<ServiceModel>.Filter.And(
                                                                    Builders<ServiceModel>.Filter.Gt(t => t.EndDate, dueDate),
                                                                    Builders<ServiceModel>.Filter.Eq(t => t.Status, Enums.ServiceHandleStatus.Registered));
    
                var update = Builders<ServiceModel>.Update.Set(t => t.Status, Enums.ServiceHandleStatus.InProcess);
    
                var options = new UpdateOptions() { IsUpsert = false };
    
                using (var result = this.manager.Trainings.UpdateManyAsync(filter, update, options))
    
    var filter=Builders.filter.And(
    Builders.Filter.Gt(t=>t.EndDate,dueDate),
    Builders.Filter.Eq(t=>t.Status,Enums.ServiceHandleStatus.Registered));
    var update=Builders.update.Set(t=>t.Status,Enums.ServiceHandleStatus.InProcess);
    var options=newupdateOptions(){IsUpsert=false};
    使用(var result=this.manager.Trainings.UpdateManyAsync(过滤器、更新、选项))
    
    有什么方向吗


    TIA.

    mongodb中唯一的原子更新是使用findAndModify,它在.NET中以FindOneAndUpdate的形式出现。因此,您可以做您想做的事情,但一次只能做一个文档

    更新

    如果您可以发出多个请求,那么可以使用UpdateMany在两个请求中执行此操作,并且不只是将它们标记为InProcess,还可以指示哪个进程正在处理它们。然后,您可以进行后续查询以返回并提取当前进程的所有进程中的查询


    唯一的问题是,您不能指示只更新10、20或10K,这意味着您不能扩展到多个“处理器”,因为您将更新所有处理器。

    因此,例如,如果我希望以每分钟10K-20k的速度收集数据。你的建议是什么?如果我必须发送20k个单一请求,这太糟糕了,你不认为吗?你认为哪一个更好,我的三阶段方式还是一步一个脚印的方式?你必须测试和观察。这完全取决于用例。但是,单独执行阶段1和阶段2将导致多个“处理者”获取相同的文档。因此,您需要结合1和2,正如我在更新的答案中提到的。如果您想支持多个“处理器”,则需要使用FindOneAndUpdate逐个执行。