[英]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/文檔:
這可以按如下方式完成:
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.