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

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

对于MongoDB的封装还在继续,对于不断追求简单的编程还在继续,对于喜欢代码的那么感觉,还在继续...

当你的mongo数据表里有子对象时,尤其是列表对象时,使用官方的驱动很是不爽,要记得很多新的对象类型,麻烦,所以,将它进行封装,让GetModel支持匿名参数!

表结构可能是这样

希望查询的语句变成这样

看了上面的语句感觉挺酷吧,呵呵,下面看一下实现的代码,今天下午写的,呵呵!

  public IEnumerable<TEntity> GetModel<U>(U template)
        {
            return _table.Find(GeneratorMongoQuery(template)).ToListAsync().Result;
        }

        public PagedResult<TEntity> GetModel<U>(int pageIndex, int pageSize)
        {
            return this.GetModel(new { }, pageIndex, pageSize);

        }

        public PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize)
        {
            return this.GetModel(template, new { }, pageIndex, pageSize);
        }

        public PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize)
        {
            #region 条件过滤
            BsonDocumentFilterDefinition<TEntity> filterDefinition = GeneratorMongoQuery(template);
            #endregion

            #region 排序处理
            SortDefinition<TEntity> sorts = new ObjectSortDefinition<TEntity>(new { });
            foreach (var item in typeof(O).GetProperties())
            {
                if ((OrderType)item.GetValue(orderby) == OrderType.Asc)
                    sorts = sorts.Ascending(item.Name);
                else
                    sorts = sorts.Descending(item.Name);
            }
            #endregion

            #region 分页处理
            var skip = (pageIndex - 1) * pageSize;

            var recordCount = _table.Find(filterDefinition).CountAsync(new CancellationToken()).Result;
            var limit = pageSize;
            return new PagedResult<TEntity>(
                recordCount,
                (int)(recordCount + pageSize - 1) / pageSize,
                pageSize,
                pageIndex,
                _table.Find(filterDefinition)
                      .Sort(sorts)
                      .Skip(skip)
                      .Limit(limit)
                      .ToListAsync().Result);
            #endregion


        }

提出了一个条件过滤的私有方法,因为它的逻辑在两个方法里都用了,所以进行提取

   /// <summary>
        /// 构建Mongo的查询表达式,通过一个匿名对象
        /// </summary>
        /// <typeparam name="U"></typeparam>
        /// <param name="template"></param>
        /// <returns></returns>
        private BsonDocumentFilterDefinition<TEntity> GeneratorMongoQuery<U>(U template)
        {
            var qType = typeof(U);
            var outter = new BsonDocument();
            var simpleQuery = new BsonDocument();
            foreach (var item in qType.GetProperties())
            {
                if (item.PropertyType.IsClass && item.PropertyType != typeof(string))
                {
                    //复杂类型,导航属性,类对象和集合对象 
                    foreach (var sub in item.PropertyType.GetProperties())
                    {
                        simpleQuery.Add(new BsonElement(item.Name + "." + sub.Name,
                           BsonValue.Create(sub.GetValue(item.GetValue(template)))
                            ));
                    }
                }
                else
                {
                    //简单类型,ValueType和string
                    simpleQuery.Add(new BsonElement(item.Name,
                      BsonValue.Create(item.GetValue(template))
                        ));
                }
            }
            return new BsonDocumentFilterDefinition<TEntity>(simpleQuery);
        }

结果就是我们想好的,怎么样,用法挺友好吧

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象,如需转载请自行联系原博主。

目录
相关文章
|
9月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
147 0
|
4月前
|
存储 JSON NoSQL
查询 MongoDB--SPL 轻量级多源混算实践 4
SPL 支持多种数据源连接,包括 MongoDB 等 NoSQL 数据库。通过外部库形式提供驱动,灵活扩展,可实现实时数据计算与混合分析。
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
11月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
428 17
|
12月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
442 9
|
存储 NoSQL MongoDB
MongoDB 查询分析
10月更文挑战第21天
118 1
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
124 1
|
SQL NoSQL MongoDB
MongoDB 查询文档
10月更文挑战第15天
431 1
|
人工智能 NoSQL 机器人
MongoDB Atlas与YoMio.AI近乎完美适配:推理更快速、查询更灵活、场景更丰富
随着MongoDB的新发布和革新,YoMio.AI的“闪电式发展”值得期待。
|
SQL NoSQL JavaScript
04 MongoDB各种查询操作 以及聚合操作总结
文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。
2658 0

推荐镜像

更多