MongoDB——更新操作(Update)c#实现

来源:互联网 发布:淘宝杜蕾斯授权店 编辑:程序博客网 时间:2024/06/07 00:57

c#实现 Mongodb存储【文档局部更新】

如下:

递归更新字段  ,构建UpdateDefinition

   /// <summary>        /// 构建更新操作定义         /// </summary>        /// <param name="bc">bsondocument文档</param>        /// <returns></returns>        private List<UpdateDefinition<BsonDocument>> BuildUpdateDefinition(BsonDocument bc, string parent )        {            var updates = new List<UpdateDefinition<BsonDocument>>();            foreach (var element in bc.Elements)            {                var key = parent == null ? element.Name : $"{parent}.{element.Name}";                var subUpdates = new List<UpdateDefinition<BsonDocument>>();                //子元素是对象                if (element.Value.IsBsonDocument)                {                    updates.AddRange(BuildUpdateDefinition(element.Value.ToBsonDocument(), key));                }                //子元素是对象数组                else if (element.Value.IsBsonArray)                {                    var arrayDocs = element.Value.AsBsonArray;                    var i = 0;                    foreach (var doc in arrayDocs)                    {                        if (doc.IsBsonDocument)                        {                            updates.AddRange(BuildUpdateDefinition(doc.ToBsonDocument(), key + $".{i}"));                        }                        else                        {                            updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));                            continue;                        }                        i++;                    }                }                //子元素是其他                else                {                    updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));                }            }            return updates;        }

注意其中key的构建,针对文档包含的子文档,需要对其key添加到根节点的路径。针对包含文档数组的,需要添加下标,指定到对应的标签进行数据的更新。

调用更新操作,更新多份文档操作如下:

/// <summary>更新</summary>        public async Task<IEnumerable<string>> UpdateAsync(MetadataCollection metadatas)        {            List<string> result = null;            var kmds = metadatas.Select(e => e.As<Metadata>()).ToList();            var docs = kmds.ConvertAll(DicConvertToBsonDoc);            var updateOptions = new UpdateOptions { IsUpsert = true };            try            {                foreach (var doc in docs)                {                    var filter = Builders<BsonDocument>.Filter.Eq(f => f[iiid], doc[iiid]);                    var update = Builders<BsonDocument>.Update.Combine(BuildUpdateDefinition(doc,null));                    await _access.UpdateAsync(filter, update, updateOptions);                }                result = metadatas.Select(s => s.IIId).ToList();            }            catch (Exception ex)            {                IndexExceptionCodes.UpdatingIndexFailed.ThrowUserFriendly(ex.Message, "更新索引失败");            }            return result;        }

其中,先将给定的模型列表转化为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}})

0 0
原创粉丝点击