[英]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
}
]
}
}
是否可以在 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.