Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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#驱动程序-基于“upert many”;候选人;钥匙_C#_Mongodb_Mongodb Query_Mongodb .net Driver - Fatal编程技术网

MongoDb C#驱动程序-基于“upert many”;候选人;钥匙

MongoDb C#驱动程序-基于“upert many”;候选人;钥匙,c#,mongodb,mongodb-query,mongodb-.net-driver,C#,Mongodb,Mongodb Query,Mongodb .net Driver,我有以下类型的mongodb集合: public class Entity { [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } public int Field1{ get; set; } public int Field2{ get; set; } } 在客户机上,我有一组这样的实体,设置了Field1和Field2,但没有Id 我想根据Field1和Field2组合

我有以下类型的mongodb集合:

public class Entity
{
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public int Field1{ get; set; }
    public int Field2{ get; set; }
}
在客户机上,我有一组这样的实体,设置了Field1和Field2,但没有Id

我想根据Field1和Field2组合(考虑唯一的“候选”键)在一批中升级它们-如果这样的组合存在-什么都不做/更新现有(相同),如果不存在-插入新实体

使用多个UpdateSync调用可以轻松完成此操作:

UpdateOptions() { IsUpsert = true }    
var filter = new FilterDefinitionBuilder<Enity>().Where(p => p.Field1 == entiy.Field1 && p.Field2 == entity.Field2);
await UpsertAsync(entity, filter);
UpdateOptions(){IsUpsert=true}
var filter=new FilterDefinitionBuilder()。其中(p=>p.Field1==entiy.Field1&&p.Field2==entity.Field2);
等待UpsertAsync(实体、过滤器);
但这并不是很多/批量操作

我正在浏览API/文档:

  • 使用BulkWriteAsync-查看答案
  • 使用InsertManyAsync,我看不出如何指定upsert
  • 使用UpdateManayAsync时,我如何将字段值组合发送到insert/update

这可以通过以下方式完成:

        List<UpdateOneModel<Entity>> requests = new List<UpdateOneModel<Entity>>(entities.Count());
        foreach (var entity in entities)
        {
            var filter = new FilterDefinitionBuilder<Entity>().Where(m => m.Field1 == entity.Field1 && m.Field2== entity.Field2);
            var update = new UpdateDefinitionBuilder<Entity>().Set(m => m.Field1, entity.Field1).Set(m => m.Field2, entity.Field2);
            var request = new UpdateOneModel<Entity>(filter, update);
            request.IsUpsert = true;
            requests.Add(request);
        }
        await Collection.BulkWriteAsync(requests);
List请求=新列表(entities.Count());
foreach(实体中的var实体)
{
var filter=new FilterDefinitionBuilder()。其中(m=>m.Field1==entity.Field1&&m.Field2==entity.Field2);
var update=new UpdateDefinitionBuilder().Set(m=>m.Field1,entity.Field1).Set(m=>m.Field2,entity.Field2);
var请求=新的UpdateModel(过滤器,更新);
request.IsUpsert=true;
请求。添加(请求);
}
等待收集。BulkWriteAsync(请求);

似乎我需要使用UpdateModel,并为BulkWriteAsync设置Upsert属性。我会试试看,可能会回答我的问题。