MongoDB——更新操作(Update)c#實現


c#實現 Mongodb存儲【文檔局部更新】

如下:

遞歸更新字段  ,構建UpdateDefinition

 

  1.  
    /// <summary>
  2.  
    /// 構建更新操作定義
  3.  
    /// </summary>
  4.  
    /// <param name="bc">bsondocument文檔</param>
  5.  
    /// <returns></returns>
  6.  
    private List<UpdateDefinition<BsonDocument>> BuildUpdateDefinition(BsonDocument bc, string parent )
  7.  
    {
  8.  
    var updates = new List<UpdateDefinition<BsonDocument>>();
  9.  
    foreach (var element in bc.Elements)
  10.  
    {
  11.  
    var key = parent == null ? element.Name : $"{parent}.{element.Name}";
  12.  
    var subUpdates = new List<UpdateDefinition<BsonDocument>>();
  13.  
    //子元素是對象
  14.  
    if (element.Value.IsBsonDocument)
  15.  
    {
  16.  
    updates.AddRange(BuildUpdateDefinition(element.Value.ToBsonDocument(), key));
  17.  
    }
  18.  
    //子元素是對象數組
  19.  
    else if (element.Value.IsBsonArray)
  20.  
    {
  21.  
    var arrayDocs = element.Value.AsBsonArray;
  22.  
    var i = 0;
  23.  
    foreach (var doc in arrayDocs)
  24.  
    {
  25.  
    if (doc.IsBsonDocument)
  26.  
    {
  27.  
    updates.AddRange(BuildUpdateDefinition(doc.ToBsonDocument(), key + $".{i}"));
  28.  
    }
  29.  
    else
  30.  
    {
  31.  
    updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
  32.  
    continue;
  33.  
    }
  34.  
    i++;
  35.  
    }
  36.  
    }
  37.  
    //子元素是其他
  38.  
    else
  39.  
    {
  40.  
    updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
  41.  
    }
  42.  
    }
  43.  
    return updates;
  44.  
    }

注意其中key的構建,針對文檔包含的子文檔,需要對其key添加到根節點的路徑。針對包含文檔數組的,需要添加下標,指定到對應的標簽進行數據的更新。

 

調用更新操作,更新多份文檔操作如下:

 

  1.  
    /// <summary>更新</summary>
  2.  
    public async Task<IEnumerable<string>> UpdateAsync(MetadataCollection metadatas)
  3.  
    {
  4.  
    List< string> result = null;
  5.  
    var kmds = metadatas.Select(e => e.As<Metadata>()).ToList();
  6.  
    var docs = kmds.ConvertAll(DicConvertToBsonDoc);
  7.  
    var updateOptions = new UpdateOptions { IsUpsert = true };
  8.  
    try
  9.  
    {
  10.  
    foreach (var doc in docs)
  11.  
    {
  12.  
    var filter = Builders<BsonDocument>.Filter.Eq(f => f[iiid], doc[iiid]);
  13.  
    var update = Builders<BsonDocument>.Update.Combine(BuildUpdateDefinition(doc,null));
  14.  
    await _access.UpdateAsync(filter, update, updateOptions);
  15.  
    }
  16.  
    result = metadatas.Select(s => s.IIId).ToList();
  17.  
    }
  18.  
    catch (Exception ex)
  19.  
    {
  20.  
    IndexExceptionCodes.UpdatingIndexFailed.ThrowUserFriendly(ex.Message, "更新索引失敗");
  21.  
    }
  22.  
    return result;
  23.  
    }

其中,先將給定的模型列表轉化為Mongodb的文檔對象BsonDocument,然后執行更新操作。指定操作如果key不存在執行插入操作。

 

 

示例如下:

Step1:查看原文檔

Step2:執行更新操作

Step3:查看更新之后的結果

 

參考如下:

MongoDB更新包含對象數組的元素: 使用mongodb中數組元素的下標來做更新(update)多維數組 例如有如下數據結構: {   "_id":ObjectId("4b97e62bf1d8c7152c9ccb74"),   ”comments“:[     {     "by":"joe",     "votes":3,     "replies":[                 {"by":"jane",                 "votes":2                }]      }]   }   如果要將"replies"中{“by”:"jane"}的投票數增加1,該如何做呢?
mongodb使用多維數組下標的方式來定位某個元素
先find({"comments.replies.by":"jane"})來獲取到整個object, 然后計算相應reply的數組下標, 再使 用update({"comments.0.replies.0.by":"jane"},{"$inc", {"comments.0.replies.0.votes":1}})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM