MongoDb C# 驱动程序 - 根据 "candidate" 键更新许多
MongoDb C# driver - upsert many based on "candidate" key
我有 mongodb collection 以下类型:
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 组合(认为是唯一的 "candidate" 键)将它们分批插入 - 如果存在这样的组合 - 如果存在 nothing/update(相同)它不存在 - 插入新实体。
可以通过多次 UpdateAsync 调用轻松完成:
UpdateOptions() { IsUpsert = true }
var filter = new FilterDefinitionBuilder<Enity>().Where(p => p.Field1 == entiy.Field1 && p.Field2 == entity.Field2);
await UpsertAsync(entity, filter);
但这不是 many/bulk 操作。
我正在浏览 API/documentation:
- 使用 BulkWriteAsync - 查看答案
- 使用 InsertManyAsync 我看不到如何指定 upsert
- 使用 UpdateManyAsync 时,我如何将字段值组合发送到 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);
今天遇到它,我想我会分享一些捷径来接受答案(感谢 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...:)
我有 mongodb collection 以下类型:
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 组合(认为是唯一的 "candidate" 键)将它们分批插入 - 如果存在这样的组合 - 如果存在 nothing/update(相同)它不存在 - 插入新实体。
可以通过多次 UpdateAsync 调用轻松完成:
UpdateOptions() { IsUpsert = true }
var filter = new FilterDefinitionBuilder<Enity>().Where(p => p.Field1 == entiy.Field1 && p.Field2 == entity.Field2);
await UpsertAsync(entity, filter);
但这不是 many/bulk 操作。
我正在浏览 API/documentation:
- 使用 BulkWriteAsync - 查看答案
- 使用 InsertManyAsync 我看不到如何指定 upsert
- 使用 UpdateManyAsync 时,我如何将字段值组合发送到 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);
今天遇到它,我想我会分享一些捷径来接受答案(感谢 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...:)