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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值