Lind.DDD.Repositories.Mongo层介绍

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

之前已经发生了

大叔之前讲过被仓储化了的Mongodb,而在大叔开发了Lind.DDD之后,决定把这个东西再搬到本框架的仓储层来,这也是大势所趋的,毕竟mongodb是最像关系数据库的NoSql,它的使用场景是其它nosql所不能及的,这点是毋庸置疑的!

下面是大叔总结的Mongodb文章目录,选自<大叔Mongodb系列>

MongoDB学习笔记~环境搭建 (2015-03-30 10:34)

MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00)

MongoDB学习笔记~ObjectId主键的设计 (2015-04-09 13:08)

MongoDB学习笔记~客户端命令行的使用 (2015-04-10 13:40)

MongoDB学习笔记~索引提高查询效率 (2015-04-10 15:35)

MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法 (2015-04-11 22:13)

MongoDB学习笔记~Mongo集群和副本集 (2015-04-17 16:25)

MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动 (2015-04-27 22:11)

MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动 (2015-04-29 22:36)

MongoDB学习笔记~为IMongoRepository接口更新指定字段(2015-04-30 22:22)

MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事

MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象

MongoDB学习笔记~Update方法更新集合属性后的怪问题

MongoDB学习笔记~批量插入方法的实现

MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

MongoDB学习笔记~自己封装的Curd操作(按需更新的先决条件)

MongoDB学习笔记~MongoDB实体中的值对象

MongoDB学习笔记~大叔框架实体更新支持N层嵌套~递归递归我爱你!

MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除

MongoDB学习笔记~MongoVUE对数据进行查询,排序和按需显示

MongoDB学习笔记~管道中的分组实现group+distinct

MongoDB学习笔记~官方驱动的原生Curd操作

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

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

MongoDB学习笔记~数据结构与实体对象不一致时,它会怎么样?

Lind.DDD里的仓储模块,Mongodb有一席之地

大叔的Mongodb仓储结构

大叔在设计mongodb查询和更新时,使用到了递归

  /// <summary>
        /// 按需要更新的构建者
        /// 递归构建Update操作串
        /// </summary>
        /// <param name="fieldList"></param>
        /// <param name="property"></param>
        /// <param name="propertyValue"></param>
        /// <param name="item"></param>
        /// <param name="fatherValue"></param>
        /// <param name="father"></param>
        private void GenerateRecursionExpress(
          List<UpdateDefinition<TEntity>> fieldList,
          PropertyInfo property,
          object propertyValue,
          TEntity item,
          object fatherValue,
          string father)
        {
            //复杂类型
            if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && propertyValue != null)
            {
                //集合
                if (typeof(IList).IsAssignableFrom(propertyValue.GetType()))
                {
                    var modifyIndex = 0;//要更新的记录索引
                    foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {
                        if (sub.PropertyType.IsClass && sub.PropertyType != typeof(string))
                        {
                            var arr = propertyValue as IList;
                            if (arr != null && arr.Count > 0)
                            {

                                var oldValue = property.GetValue(fatherValue ?? item) as IList;
                                if (oldValue != null)
                                {
                                    for (int index = 0; index < arr.Count; index++)
                                    {
                                        for (modifyIndex = 0; modifyIndex < oldValue.Count; modifyIndex++)
                                            if (sub.PropertyType.GetProperty(EntityKey).GetValue(oldValue[modifyIndex]).ToString()
                                                == sub.PropertyType.GetProperty(EntityKey).GetValue(arr[index]).ToString())//比较_id是否相等
                                                break;
                                        foreach (var subInner in sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                                        {
                                            if (string.IsNullOrWhiteSpace(father))
                                                GenerateRecursionExpress(fieldList, subInner, subInner.GetValue(arr[index]), item, arr[index], property.Name + "." + modifyIndex);
                                            else
                                                GenerateRecursionExpress(fieldList, subInner, subInner.GetValue(arr[index]), item, arr[index], father + "." + property.Name + "." + modifyIndex);
                                        }
                                    }
                                }

                            }
                        }
                    }
                }
                //实体
                else
                {
                    foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
                    {

                        if (string.IsNullOrWhiteSpace(father))
                            GenerateRecursionExpress(fieldList, sub, sub.GetValue(propertyValue), item, property.GetValue(fatherValue), property.Name);
                        else
                            GenerateRecursionExpress(fieldList, sub, sub.GetValue(propertyValue), item, property.GetValue(fatherValue), father + "." + property.Name);
                    }
                }
            }
            //简单类型
            else
            {
                if (property.Name != EntityKey)//更新集中不能有实体键_id
                {
                    if (string.IsNullOrWhiteSpace(father))
                        fieldList.Add(Builders<TEntity>.Update.Set(property.Name, propertyValue));
                    else
                        fieldList.Add(Builders<TEntity>.Update.Set(father + "." + property.Name, propertyValue));
                }
            }
        }

让代码去改变我们的生活,改变我们的世界吧!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:Lind.DDD.Repositories.Mongo层介绍,如需转载请自行联系原博主。

相关实践学习
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
目录
相关文章
|
SQL 缓存 Java
殷浩详解DDD系列 第三讲 - Repository模式
# 第三讲 - Repository模式 **写在前面** 这篇文章和上一篇隔了比较久,一方面是工作比较忙,另一方面是在讲Repository之前其实应该先讲Entity(实体)、Aggregate Root(聚合根)、Bounded Context(限界上下文)等概念。但在实际写的过程中,发现单纯讲Entity相关的东西会比较抽象,很难落地。所以本文被推倒重来,从Repository
36404 8
|
4月前
|
NoSQL 关系型数据库 MySQL
关于项目中 Repository 层的思考
关于项目中 Repository 层的思考
71 0
|
存储 SQL 缓存
DDD之Repository
之前的DDD文章中也指出过,现在从理论角度对于repository是错误,但一直没有摸索出最佳实践,都是当DAO使用,区别在于repository是领域层,也没有深入思考过 最近再次温习《DDD第二弹》时,看到了这个评论
990 0
DDD之Repository
|
存储 缓存 Java
DDD之Repository对象生命周期管理
在DDD中Repository是一个相当重要的概念。聚合是战略与战术之间的交汇点。而管理聚合的正是Repository。 因为从战略层次,分而治之,我们会按领域、子域、界限上下文、聚合逐步划分降低系统复杂度;从战术层次,我们会从实体、值对象、聚合逐步归并,汇合。 也因此有人解析DDD关键就是两个字:分与合,分是手段,合是目的。 之前写的《DDD之Repository》[1],大致介绍了Repository作用。
833 1
DDD之Repository对象生命周期管理