Как обернуть массовую вставку в Mongo с помощью Task в C # - PullRequest
0 голосов
/ 02 июля 2018

У меня есть модель

public partial class Option
{
  [BsonId]
  public int Id { get; set; }
  public Quote Quote { get; set; }
  public Contract Contract { get; set; }
}

Метод массовой записи

public Task SaveOptions(List<Option> contracts)
{
  var context = new MongoContext();
  var processes = new List<Task<UpdateResult>>();
  var collection = context.Storage.GetCollection<Option>("options");

  contracts.ForEach(contract =>
  {
    var item = Builders<Option>.Update.Set(o => o, contract);
    var options = new UpdateOptions { IsUpsert = true };

    processes.Add(collection.UpdateOneAsync(o => o.Id == contract.Id, item, options));
  });

  return Task.WhenAll(processes);
}

Позвоните по вышеуказанному методу

Task.WhenAll(service.SaveOptions(contracts)) // also tried without Task.WhenAll

По какой-то причине он не создает никаких записей в БД Mongo

Обновление

Пытался переписать объемную запись таким образом, без изменений.

public Task SaveOptions(List<Option> contracts)
{
  var context = new MongoContext();
  var records = new List<UpdateOneModel<Option>>();
  var collection = context.Storage.GetCollection<Option>("options");

  contracts.ForEach(contract =>
  {
    var record = new UpdateOneModel<Option>(
      Builders<Option>.Filter.Where(o => o.Id == contract.Id),
      Builders<Option>.Update.Set(o => o, contract))
    {
      IsUpsert = true
    };

    records.Add(record);
  });

  return collection.BulkWriteAsync(records);
}

1 Ответ

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

Я думаю, что вы хотите использовать ReplaceOneAsync:

processes.Add(collection.ReplaceOneAsync(o => o.Id == contract.Id, contract, options));

Проблема с использованием UpdateOneAsync заключается в том, что вы должны указать поле для обновления, а o => o этого не делает. Поскольку вы хотите заменить весь объект, вам нужно использовать ReplaceOneAsync.

** Обратите внимание, что вы также можете сделать это с BulkWriteAsync, создав ReplaceOneModel вместо UpdateOneModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...