Processing math: 100%

MongoDB学习笔记~官方驱动嵌套数组对象的更新

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp驱动是不支持的,今天要说的就是如何让它支持子数组的更新,下面是我给出的数据结构

在Mongodb的Csharp驱动里,一般的更新方法如下

  update = new UpdateDocument {{ "$set",       
                                  new BsonDocument("OrderList.$.UserName","占占的订单")
                              }};
  mongoRepository.Collection.Update(query, update);

上面代码可以很快速的将指定的二级数组OrderList里的UserName字段更新,而如果你要更新OrderDetail就没那么容易了,Csharp驱支目前是不支持的,当然你肯定会照着葫芦画飘,但结果是失败的,就像下面的代码(失败,只有既望新版驱动了)

  update = new UpdateDocument {{ "$set",       
                                  new BsonDocument("OrderList.$.OrderDetail.ProductName","占占")
                              }};
  mongoRepository.Collection.Update(query, update);

结果是OrderDetail的ProductName没有发生任何变化,呵呵。

去找原因,去找资料,还好,找到了一个不错的说法,即要想更新数组内的数组,需要将对上级数据进行定位,如OrderList.0.OrderDetail,这表示下标为0的OrderList数组元素(一个实体)下的OrderDetail数组对象,当然这个下标可不是那么轻易能得到的,

我们需要对数组进行遍历,找到满足条件的后,进行break即可。

var mongoRepository = new MongoDB.Data.Core.MongoOfficialRepository<Person>();
            var query = Query.EQ("OrderList._id", twoID);
            var oo = mongoRepository.Collection.Find(query).FirstOrDefault();
            var update = new UpdateDocument();
            bool isExit = false;
            for (int j = 0; j < oo.OrderList.Count; j++)
            {
                var od = oo.OrderList[j].OrderDetail;
                oo.OrderList[j].UserName = "大占占改呀";
                for (int i = 0; i < od.Count; i++)
                {
                    if (od[i].Id == threeID)
                    {
                        od[i].ProductName = "大占占修改了订单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",oo.OrderList[j].UserName)
                                                    }};
                        mongoRepository.Collection.Update(query, update);

                        update = new UpdateDocument {{ "$set", 
                                                         new BsonDocument("OrderList."+j+".OrderDetail."+i,
                                                         new BsonDocument(od[i].ToDictionary()))
                                                    }};
                        mongoRepository.Collection.Update(query, update);
                        #endregion
                        isExit = true;
                        break;
                    }
                }
                if (isExit)
                    break;
            }

上面的代码,我们看到了有两种更新集合的方法,pullpush方法及$set方法,大家可以根据喜好进行选择,都可以实现我们的目的,ToDictionary是我封装的方法,意思是将类对象里的属性转换为字典,并做了mongodb的_id主键的处理,代码如下

/// <summary>
        /// 将对象属性转换为字典
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static Dictionary<String, Object> ToDictionary(this object o)
        {
            Dictionary<String, Object> map = new Dictionary<string, object>();
            Type t = o.GetType();
            PropertyInfo[] pi = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo p in pi)
            {
                MethodInfo mi = p.GetGetMethod();

                if (mi != null && mi.IsPublic)
                {
                    if (p.Name == "Id")
                        map.Add("_id", mi.Invoke(o, new Object[] { }));
                    else
                        map.Add(p.Name, mi.Invoke(o, new Object[] { }));
                }
            }
            return map;
        }
    }

对于mongodb的探索,还在继续...

本文转自博客园张占岭(仓储大叔)的博客,原文链接: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
目录
相关文章
mongodb官方提供的卸载流程
很简单的卸载流程,快速高效
426 0
实时计算 Flink版产品使用合集之要将收集到的 MongoDB 数据映射成 JSON 对象而非按字段分割,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
109 1
|
11月前
|
通过优化索引以消除 MongoDB 中的 "查询目标已超过1000个扫描对象/返回的文档数" 警告
MongoDB NoSQL数据库在处理复杂查询时可能出现“查询目标已超过1000个扫描对象/返回的文档数”警告。文章分析了该问题,展示了一个示例集合和相关索引,并提供了查询示例。通过`explain`命令发现查询未有效利用索引。解决方案是遵循ESR规则,创建新索引从而优化查询并消除警告。
261 1
DataWorks产品使用合集之DataWorks将 MongoDB 中的数组类型写入到 DataWorks 的单个字段时,表示为字符串格式而非 JSON 格式如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
102 3
MongoDB白皮书|应用程序驱动型智能:定义下一代成功的现代应用程序
MongoDB Atlas 开发者数据平台旨在帮助这两个团队“乘风破浪”,从而打造更快、更智能的应用和自动化业务流程,能够更快地对快速变化的操作数据做出反应和响应。
3316 0
|
11月前
|
mongodb查询文档内部属性以及数组
mongodb查询文档内部属性以及数组
193 0
MongoDB推出四项AI驱动的新功能,助力开发者提升效率并加速应用程序现代化
生成式人工智能让开发者有机会构建更好的应用程序。通过自动执行重复性任务,由AI驱动的工具和功能可以帮助开发者节省大量时间和精力,同时更快地交付更高质量的应用程序
MongoDB推出四项AI驱动的新功能,助力开发者提升效率并加速应用程序现代化
MongoDB与阿里云携手驱动WeLab汇立集团引领超千万用户迈向智能金融未来
阿里云数据库MongoDB版无论从数据特点还是技术要求方面,都完美地匹配了WeLab的需求
1077 0
MongoDB与阿里云携手驱动WeLab汇立集团引领超千万用户迈向智能金融未来
MongoDB 操作(CRUD) 教程—官方原版
MongoDB 操作(CRUD) 教程—官方原版
250 0

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等