• 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层的更新还没有实现,呵呵,开发进行中...

    回到目录

  • 相关阅读:
    小艾电台-小众音乐科普讲座
    永乐计分器
    顺金斗花牌-比大小
    Bigger_0305
    iTunes Connect后台无法创建App的解决方案
    iOS navigationBar导航栏底部与self.view的分界线的隐藏
    iOS 十六进制的相加取反
    UITabBar-UITabBarItem图片的背景颜色属性和文字的颜色大小设置
    iOS GCD多线程介绍
    [POJ3461] Oulipo
  • 原文地址:https://www.cnblogs.com/lori/p/4828107.html
Copyright © 2020-2023  润新知