MongoDB学习笔记~使用原生语句实现三层集合关系的更新
MongoDB的文档型数据结构使得它在存储数据上很像JSON,在可读性方面很强,然而这种复杂的结构在update时相对麻烦一些,而对于官方给出的文档说的也不够细致,有些东西也是模棱两可的态度,对于多层嵌套的集合对象,实现update更是麻烦,而目前我们所验证的是,原生语句最多支持三层集合对象,层次再多就无法实现了。
三层集合关系对象代码如下,其实是内嵌两层,算上实体,共三层集合
对于这种结构,我们使用原生的语句是可以对OrderDetail这个层次的对象进行更新的,下面是我的做法
1 通过三级id查询一级大对象(Query.EQ)(包括所有二级和三级)
var query = Query.EQ("OrderList.OrderDetail._id", threeID);
2 通过SetFields过滤多余的二级对象
var oo = mongoRepository.Collection.Find(query).SetFields("OrderList.$").FirstOrDefault();
3 对象查询出来后,三级对象列表只能通过遍历的方法查询出来,并对它进行赋值更新
for (int i = 0; i < orderDetail.Count; i++) { if (orderDetail[i].Id == threeID) { orderDetail[i].ProductName = "大占占修改了订单 2015-09-21"; break; } }
好了,说话了步骤,再来看一下完整的代码
var threeID = ObjectId.Parse("55c012232683c8143c3b494d"); var mongoRepository = new MongoDB.Data.Core.MongoOfficialRepository<Person>(); var query = Query.EQ("OrderList.OrderDetail._id", threeID); var oo = mongoRepository.Collection.Find(query).SetFields("OrderList.$").FirstOrDefault(); var update = new UpdateDocument(); var OrderInfo = oo.OrderList.FirstOrDefault(); var orderDetail = OrderInfo.OrderDetail; for (int i = 0; i < orderDetail.Count; i++) { if (orderDetail[i].Id == threeID) { orderDetail[i].ProductName = "大占占修改了订单 2015-09-21"; #region 先pull,再push //update = new UpdateDocument {{ "$pull", // new BsonDocument("OrderList."+j+".OrderDetail", // new BsonDocument("_id",threeID)) // }}; //mongoRepository.Collection.Update(query1, update); //update = new UpdateDocument {{ "$push", // new BsonDocument("OrderList."+j+".OrderDetail", // new BsonDocument(od[i].ToDictionary())) // }}; //mongoRepository.Collection.Update(query1, update); #endregion #region 直接set update = new UpdateDocument {{ "$set", new BsonDocument("OrderList.$.UserName","大叔2015-09-21") }}; mongoRepository.Collection.Update(query, update); update = new UpdateDocument {{ "$set", new BsonDocument("OrderList.$.OrderDetail."+i, new BsonDocument(orderDetail[i].ToDictionary())) }}; mongoRepository.Collection.Update(query, update); #endregion break; } }
最后的结果是我们希望看到的,性能比之前的版本少了一层(二次分类)遍历,可以接受!
就大叔的性格来说,MongoDB的嵌套更新还会在研究,开发还会在继续,因为向4层的更新还没有实现,呵呵,开发进行中...
分类:
mongoDB
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2012-09-22 将不确定变为确定系列~Linq的批量操作靠的住吗?