MongoDB学习笔记~使用原生语句实现三层集合关系的更新

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

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学习笔记~使用原生语句实现三层集合关系的更新,如需转载请自行联系原博主。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
5月前
|
NoSQL MongoDB 数据库
04 MongoDB - 集合操作
04 MongoDB - 集合操作
23 0
|
8月前
|
NoSQL MongoDB 数据库
MongoDB常用的操作(服务器、数据库、集合)
MongoDB常用的操作(服务器、数据库、集合)
1935 0
|
9月前
|
NoSQL MongoDB Cloud Native
【mongo 系列】mongodb 学习十一,MongoDB 分片集群之分片集合
MongoDB 中 分片集群有专门推荐的模式,例如 分片集合
|
9月前
|
NoSQL MongoDB 数据库
MongoDB 删除集合
MongoDB 删除集合
79 0
|
9月前
|
NoSQL MongoDB 数据库
MongoDB 创建集合
MongoDB 创建集合
367 0
|
11月前
|
NoSQL MongoDB 数据库
开心档-软件开发入门之MongoDB 删除集合
【摘要】 本章节我们为大家介绍如何使用 MongoDB 来删除集合。
|
11月前
|
NoSQL MongoDB 数据库
软件开发入门教程网之MongoDB 创建集合
【摘要】 本章节我们为大家介绍如何使用 MongoDB 来创建集合。
|
11月前
|
缓存 NoSQL MongoDB
开心档-软件开发入门之MongoDB 固定集合(Capped Collections)
【摘要】 本章将会讲解MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!
|
11月前
|
NoSQL MongoDB 数据库
开心档 - 软件开发入门之 MongoDB 创建集合
本章节我们为大家介绍如何使用 MongoDB 来创建集合。MongoDB 中使用 createCollection() 方法来创建集合。语法格式:
开心档 - 软件开发入门之 MongoDB 创建集合
|
11月前
|
NoSQL MongoDB 数据库
一日一技:如何找到 MongoDB 占用空间最大的集合?
一日一技:如何找到 MongoDB 占用空间最大的集合?
247 0