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 IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2012-07-31 C# 禁用本地连接和修改IE设置
2008-07-31 页面动态注册脚本(小技巧)
2008-07-31 动态画table(小技巧)
2008-07-31 Import和Assembly
2008-07-31 Post和Get的区别(兼谈页面间传值的方式)(转)
2008-07-31 ASP.NET十分有用的页面间传值方法(转)
2007-07-31 SOA and Web services 新手入门