简体   繁体   English

如何在 MongoDb C# 驱动程序的嵌套集合中进行批量更新?

[英]How to make bulk upsert in nested collection in MongoDb C# Driver?

For instance, we have a collection:例如,我们有一个集合:

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

In the next operation we received:在接下来的操作中,我们收到:

{
   "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. I need to create request if it doesn't exist and update it if it exists.如果请求不存在,我需要创建请求,如果存在则更新它。
  2. For a nested collection I need to insert element if a result with some ResultCode doesn't exists or update/replace if a result with some ResultCode exists.对于嵌套集合,如果具有某些 ResultCode 的结果不存在,我需要插入元素;如果具有某些 ResultCode 的结果存在,则需要更新/替换。

Is it possible to do bulk upsert in MongoDb?是否可以在 MongoDb 中进行批量更新? Or I just have to at first check if request exists and then update all values inside it or create it and after that go through all results in received collection and check if some ResultCode exists in already saved collection?或者我只需要首先检查请求是否存在,然后更新其中的所有值或创建它,然后通过接收到的集合中的所有结果 go 并检查已保存的集合中是否存在某些 ResultCode? If yes then update all fields inside, if no then insert result in Results collection如果是,则更新里面的所有字段,如果不是,则将结果插入结果集合

Could you please recommend any good sources with mongodb examples for c#?您能否推荐任何具有 c# 示例的 mongodb 示例的好资源?

Currently my solution looks like this:目前我的解决方案如下所示:

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

Maybe it's possible to make it better?也许有可能让它变得更好?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM