【问题标题】:MongoDb C# driver - upsert many based on "candidate" keyMongoDb C# 驱动程序 - 基于“候选”键插入许多
【发布时间】:2015-12-31 07:50:29
【问题描述】:

我有以下类型的 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 其神秘之处在于如何将字段值组合发送到插入/更新

【问题讨论】:

  • 看来我需要使用 UpdateOneModel 和为 BulkWriteAsync 设置的 Upsert 属性。我会试试看,可能会回答我的问题。

标签: c# mongodb mongodb-query mongodb-.net-driver


【解决方案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);

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 2017-05-09
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多