MongoDb C#驱动程序 - 基于"候选者"键

时间:2015-12-31 07:50:30

标签: 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组合在一个批处理中将它们挂起(认为是唯一的"候选"键) - 如果存在这样的组合 - 什么都不做/更新现有(它是相同的),如果它不存在 - 插入新实体。

可以通过多个UpdateAsync调用轻松完成:

UpdateOptions() { IsUpsert = true }    
var filter = new FilterDefinitionBuilder<Enity>().Where(p => p.Field1 == entiy.Field1 && p.Field2 == entity.Field2);
await UpsertAsync(entity, filter);

但这并不是很多/批量操作。

我正在查看API /文档:

  • 使用BulkWriteAsync - 请参阅答案
  • 使用InsertManyAsync,我无法看到如何指定upsert
  • 使用UpdateManyAsync,它的神秘内容如何发送字段值组合以插入/更新

1 个答案:

答案 0 :(得分:1)

这可以按如下方式完成:

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