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

对于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);
        }

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

时间: 2024-08-27 08:57:58

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

mongodb学习笔记系列一

一.简介和安装 ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017 mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,--smallfiles 二.基本命令 1.登录mongodb client /use/local/mongo 2.查看当前数据库 show databases; show dbs; 两个可能 3.admin是和管理有关的库,local 是放schema有关

MongoDB 学习笔记(二) 之查询

最简单的查询 个人认为mongoDB是面向对象的吧. 例如最简单的查询  整个数据集只有三条数据 第一查询姓名为张三的  数据 查询的条件比较好写 随意   db.collection.find(查询条件)   例如 15 得到的结果是这样 如果你不想返回某个字段呢 ,你可以自己定义返回的字段值 语法这样 db.collection.find({查询条件},{返回字段}) 16 我们看到每次查询 "_id" 这个字段 都返回  我们可以将它设置为0 这样的话就不会返回 如 查询条件里的

[Spring Data MongoDB]学习笔记--MongoTemplate查询操作

查询操作主要用到两个类:Query, Criteria 所有的find方法都需要一个query的object. 1. 直接通过json来查找,不过这种方式在代码中是不推荐的. BasicQuery query = new BasicQuery("{ age : { $lt : 50 }, accounts.balance : { $gt : 1000.00 }}"); List<Person> result = mongoTemplate.find(query, Perso

MongoDB 学习笔记(一)基础篇

1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱动 2.体系结构 一台服务器可以创建多个Server 实例和数据库,(推荐一天server 机器创建一个实例), 数据库:MongoDB 中的一系列与磁盘有关的物理文件(数据文件,日志文件等). 数据逻辑结构:文档 (documnet) 集合(collection) 数据库(database). d

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

MongoDB学习笔记一:MongoDB的下载和安装

趁着这几天比较空闲,准备学习一下MongoDB数据库,今天就简单的学习了一些MongoDB的下载和安装,并创建了存储MongoDB的数据仓库.将自己今天学习到的写成博客分享给大家. 一.MongoDB的下载和安装 MongoDB的下载地址为:http://www.mongodb.org/ 1.进入官网的首页后,在首页的右上方单击Downloads连接,如图所示: 2.在页面中可以看到目前最新的版本和以前发布过的版本,这里选择最新版本,windows 32位的进行下载,文件的格式为ZIP格式的,单

MongoDB学习笔记(一:安装时出现The default storage engine &#39;wiredTiger&#39; is not available问题解决)

今晚在自己老式笔记本来试了一下MongoDB的安装,由于配置比较低,只能选择32位版本的MongoDB进行安装,在安装过程中碰到了上述标题所示错误,自己也捣鼓了一个小时左右,终于在一篇博客中找到答案,具体原文链接如下:http://blog.csdn.net/u013457382/article/details/50775268 MongoDB学习笔记(一:安装时出现The default storage engine 'wiredTiger' is not available问题解决)

Mongodb学习笔记

总结下这几天Mongodb学习笔记 /** * 获取MongoClient * @author xuyw * @email [email protected] * @param host * @param port * @return */ public static MongoClient getMongoClient(String host, int... port) { MongoClient mongoClient = null; int portlen = 0; try { if (p

[Spring Data MongoDB]学习笔记--建立数据库的连接

1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoDbFactory { DB getDb() throws DataAccessException; DB getDb(String dbName) throws DataAccessException; } 然后我们可以继续用MongoDbFactory来创建MongoTemplate的实例. pu