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}})
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。