Как обновить много документов, используя UpdateManyAsync - PullRequest
0 голосов
/ 05 июля 2018

У меня есть следующий метод для обновления документа в MongoDB:

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

Что отлично работает - мне просто интересно, есть ли у кого-нибудь пример того, как работает функция UpdateManyAsync:

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

Любой совет приветствуется!

1 Ответ

0 голосов
/ 05 июля 2018

UpdateOneAsync работает так же, как update с multi: true в оболочке Mongo. Таким образом, вы можете указать условие фильтрации и операцию обновления, и это повлияет на несколько документов. Например, чтобы увеличить все поля a, где a больше 10, вы можете использовать этот метод:

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

Полагаю, вы хотите заменить несколько документов. Это может быть достигнуто с помощью метода bulkWrite . Если вам нужен универсальный метод в C #, вы можете ввести некоторый интерфейс маркера для создания части фильтра операции замены:

public interface IMongoIdentity
{
    ObjectId Id { get; set; }
}

Затем вы можете добавить общий класс в ваш класс и использовать 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...