簡體   English   中英

MongoDb C# 驅動程序 - 根據“候選”鍵插入許多

[英]MongoDb C# driver - upsert many based on "candidate" key

我有以下類型的 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 它的神秘我如何發送字段值組合以插入/更新

這可以按如下方式完成:

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

今天遇到它,我想我會分享一些捷徑來接受答案(感謝 Conrtledt),以防萬一有人感興趣:

await _mongoCollection.BulkWriteAsync(
                items.Select(i=>
                    new UpdateOneModel<T>(
                        filter: Builders<T>.Filter.Where(m=>m.Field1 == i.Field1 /*add more conditions*/),
                        update: Builders<T>.Update.Set(m=>m.Field2, i.Field2)/*add more .Set(...)*/)
            {
                IsUpsert = true
            }));

它也可以與 ReplaceOneModel 一起使用(如果您想一次設置所有字段而不指定 set.set.set ... :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM