你的位置:首页 > 数据库

[数据库]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;        }      }

最后的结果是我们希望看到的,性能比之前的版本少了一层(二次分类)遍历,可以接受!

什么时候去凤凰旅游最好凤凰跟团旅游报价多少凤凰旅游必去的地方是凤凰旅游必去景点排名凤凰旅游地图线路大全夏威夷美食特产全概括_感受不一样的魅力国度 毛里求斯旅游攻略 感受浪漫之旅 加拿大旅游全攻略 夏威夷之旅浪漫激情的结合 一个人的英雄路—华山之道 绿皮书_中国旅游日设立是具有里程碑意义的大事 你不一定知道的九寨沟 品味苦苦菜让人又爱又恨的家乡菜 厦门旅游:购物在白鹭洲 斐济岛文化历史 法国大餐概述 新西兰特产店 2013年五一期间天气预报,2013年五一去哪里玩? 三亚大东海在哪?怎么去? 2013五一厦门去哪里玩?五一厦门有哪些免费的景点? 在海口哪里可以吃到最好清补凉? X5083S8Z-4.5A Datasheet X5083S8Z-4.5A Datasheet X5165S8Z Datasheet X5165S8Z Datasheet X5083V8IZ Datasheet X5083V8IZ Datasheet 上海到沙巴旅游 上海到沙巴旅游 上海到沙巴旅游 去香港买iphone4s 去香港买iphone4s 去香港买iphone4s 冬天去哪玩 冬天去哪玩 冬天去哪玩