Как сделать массовую вставку во вложенную коллекцию в драйвере MongoDB C #?

#c# #mongodb #nosql #mongodb-.net-driver

#c# #mongodb #nosql #mongodb-.net-driver

Вопрос:

Например, у нас есть коллекция:

 {
   "Request":{
      "RequestCode":1,
      "Note":"test updated",
      "Results":[
         {
            "ResultCode":1,
            "Name":"Test",
            "Value":10
         },
         {
            "ResultCode":2,
            "Name":"Second result",
            "Value":15
         }
      ]
   }
}
 

В следующей операции мы получили:

 {
   "Request":{
      "RequestCode":1,
      "Note":"test updated again",//UPDATED
      "Results":[
         {
            "ResultCode":1,
            "Name":"Test",
            "Value":15  //UPDATED
         },
         {
            "ResultCode":2,
            "Name":"Second result",
            "Value":15
         },
         { //ADDED
            "ResultCode":3,
            "Name":"Third result",
            "Value":14
         }
      ]
   }
}
 
  1. Мне нужно создать запрос, если он не существует, и обновить его, если он
    существует.
  2. Для вложенной коллекции мне нужно вставить элемент, если результат с некоторым результирующим кодом не существует, или обновить / заменить, если результат с некоторым результирующим кодом существует.

Возможно ли выполнить массовую вставку в MongoDB? Или мне просто нужно сначала проверить, существует ли запрос, а затем обновить все значения внутри него или создать его, а после этого просмотреть все результаты в полученной коллекции и проверить, существует ли какой-либо код результата в уже сохраненной коллекции? Если да, то обновите все поля внутри, если нет, то вставьте результат в коллекцию результатов

Не могли бы вы порекомендовать какие-нибудь хорошие источники с примерами mongodb для c #?

Комментарии:

1. Что такое вложенная коллекция?

2. @D.SM В этом примере вложенной коллекцией является «Результаты». Я хотел бы знать, возможно ли массовое обновление в MongoDB?

3.Смотрите docs.mongodb.com/manual/reference/operator/update/….

Ответ №1:

В настоящее время мое решение выглядит так:

 var collection = GetCollection();

        var filter = Builders<Request>.Filter.Eq(e => e.RequestCode, model.RequestCode);
        var definition = Builders<Request>.Update
            .SetOnInsert(e => e.RequestCode, model.RequestCode)
            .Set(e => e.Note, model.Note)
            .SetOnInsert(e => e.Results, new List<Result>());

        await collection.UpdateOneAsync(filter, definition, new UpdateOptions { IsUpsert = true });

        var currentRequest = await FindOneAsync(x => x.RequestCode == model.RequestCode);

        foreach (var result in model.Results)
        {
            var currentResult = currentRequest.Results.FirstOrDefault(
                e => e.ResultCode == result.ResultCode);

            if (currentResult == null)
            {
                currentRequest.Results.Add(new Result
                {
                    ResultCode = result.ResultCode,
                    Name = result.Name,
                    Value = result.Range
                });
            }
            else
            {
                currentResult.ResultCode = result.ResultCode;
                currentResult.Name = result.Name;
                currentResult.Value= result.Value;
            }

        }

        await collection.FindOneAndReplaceAsync(e => e.RequestCode== request.RequestCode, currentRequest);
 

Может быть, можно сделать это лучше?