如何使用 UpdateManyAsync 更新多个文档

Tom*_*eck 5 mongodb mongodb-query mongodb-.net-driver

我有以下方法来更新 MongoDB 中的文档:

public async Task UpdateAsync(T entity)
{
    await _collection.ReplaceOneAsync(filter => filter.Id == entity.Id, entity);
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常 - 我只是想知道是否有人有这个UpdateManyAsync函数如何工作的例子:

public async Task UpdateManyAsync(IEnumerable<T> entities)
{
    await _collection.UpdateManyAsync(); // What are the parameters here
}
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏!

mic*_*ckl 5

UpdateOneAsyncupdatemulti: trueMongo shell 中的工作方式相同。所以你可以指定过滤条件和更新操作,它会影响多个文档。例如,要增加大于您可以使用此方法的所有a字段:a10

var builder = Builders<SampleClass>.Update;
await myCollection.UpdateManyAsync(x => x.a > 10, builder.Inc(x => x.a, 1));
Run Code Online (Sandbox Code Playgroud)

我猜您想替换多个文档。这可以使用bulkWrite方法来实现。如果您需要 C# 中的泛型方法,那么您可以引入某种标记接口来构建替换操作的过滤器部分:

public interface IMongoIdentity
{
    ObjectId Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以向你的类添加通用常量并BuikWrite在 .NET 中使用,如下所示:

class YourRepository<T> where T : IMongoIdentity
{
    IMongoCollection<T> collection;

    public async Task UpdateManyAsync(IEnumerable<T> entities)
    {
        var updates = new List<WriteModel<T>>();
        var filterBuilder = Builders<T>.Filter;

        foreach (var doc in entities)
        {
            var filter = filterBuilder.Where(x => x.Id == doc.Id);
            updates.Add(new ReplaceOneModel<T>(filter, doc));
        }

        await collection.BulkWriteAsync(updates);
    }
}
Run Code Online (Sandbox Code Playgroud)