簡體   English   中英

如何在 MongoDb C# 驅動程序的嵌套集合中進行批量更新?

[英]How to make bulk upsert in nested collection in MongoDb C# 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. 對於嵌套集合,如果具有某些 ResultCode 的結果不存在,我需要插入元素;如果具有某些 ResultCode 的結果存在,則需要更新/替換。

是否可以在 MongoDb 中進行批量更新? 或者我只需要首先檢查請求是否存在,然后更新其中的所有值或創建它,然后通過接收到的集合中的所有結果 go 並檢查已保存的集合中是否存在某些 ResultCode? 如果是,則更新里面的所有字段,如果不是,則將結果插入結果集合

您能否推薦任何具有 c# 示例的 mongodb 示例的好資源?

目前我的解決方案如下所示:

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);

也許有可能讓它變得更好?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM