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

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

关于官方驱动集成IQueryable之后的一些事,有好事也有坏事,好事就是它会将你的linq语句非常友好的翻译成MongoDB语句,而坏事就是有一些linq语句不会被翻译,不会被翻译的代价就是将整个结果集装到内存,然后进行linq to object的查询,效率自然是非常低的,呵呵。

好事

最新官方驱动中,添加了对IQueryable扩展方法的支持

        public static IMongoQueryable<TDocument> AsQueryable<TDocument>(this IMongoCollection<TDocument> collection);

1 它对Where完成支持

_webManageUsersRepository.GetModel().Where(i => i.LoginName == "zzl");

2 它对group完全支持

 var g = _webManageUsersRepository.GetModel()
                .GroupBy(i => i.DepartmentID, (i, v) => new 
                {
                    dept = i,
                    userCount = v.Count()
                });

通过断点我们可以看到它所生成的mongodb语句,然后可以把语句放在命令行中去执行看看具体效果

db.WebManageUsers.aggregate([{ "$group" : { "_id" : "$DepartmentID", "userCount" : { "$sum" : 1 } } }])

上面写法是我比较喜欢的lambda表达式的方法,语法简介,漂亮,而我不太喜欢linq写法,但是,如果是多字段的分组,你就必须使用linq标准写法了,因为到目前为止,mongo官方驱动还不支持多字段分组的lambda写法,如下面的代码,分组结果就是错误的

 var bb = _webManageUsersRepository.GetModel()
                .GroupBy(
                i => new
                {
                    i.DepartmentID,
                    i.Status
                },
                (i, v) => new
                {
                    dept = i.DepartmentID,
                    status = i.Status,
                    userCount = v.Count()
                });

它不能正确的翻译成Mongo表达式

{aggregate([{ "$group" : { "dept" : "$DepartmentID", "status" : "$Status", "userCount" : { "$sum" : 1 }, "_id" : 0 } }])}

而使用传统的linq写法就可以被mongo驱动很好的翻译

  var gg = from a in _webManageUsersRepository.GetModel()
                     group a by new
                     {
                         dept = a.DepartmentID,
                         status = a.Status
                     } into g
                     select new RoleCount
                     {
                         dept = g.Key.dept,
                         status = g.Key.status,
                         userCount = g.Count()
                     };

下面生成的代码是正确的

aggregate([{ "$group" : { "_id" : { "dept" : "$DepartmentID", "status" : "$Status" }, "__agg0" : { "$sum" : 1 } } }, { "$project" : { "dept" : "$_id.dept", "status" : "$_id.status", "userCount" : "$__agg0", "_id" : 0 } }])}

可以在mongo客户端上看到正确的结果

坏事

对count()方法完成不支持,不推荐使用,如果要用到count(),建议使用mongo原生态的,而不是linq的

            Stopwatch sw1 = new Stopwatch();
            sw1.Restart();
            var a1 = _webManageUsersRepository.Count(i => true);//性能好
            sw1.Stop();
            var at1 = sw1.ElapsedMilliseconds;

            Stopwatch sw = new Stopwatch();
            sw.Restart();
            var a = _webManageUsersRepository.GetModel().Count();//性能差
            sw.Stop();
            var at = sw.ElapsedMilliseconds;

本文转自博客园张占岭(仓储大叔)的博客,原文链接:MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事,如需转载请自行联系原博主。

相关实践学习
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
目录
相关文章
|
9天前
|
Java jenkins Shell
jenkins学习笔记之五:Maven、Ant、Gradl、Node构建工具集成
jenkins学习笔记之五:Maven、Ant、Gradl、Node构建工具集成
|
9天前
|
jenkins 持续交付
jenkins学习笔记之六:共享库方式集成构建工具
jenkins学习笔记之六:共享库方式集成构建工具
|
9天前
|
jenkins 持续交付
jenkins学习笔记之九:jenkins认证集成github
jenkins学习笔记之九:jenkins认证集成github
|
9天前
|
安全 jenkins 持续交付
jenkins学习笔记之八:jenkins认证集成gitlab
jenkins学习笔记之八:jenkins认证集成gitlab
|
9天前
|
jenkins Devops 持续交付
jenkins学习笔记之七:jenkins集成LDAP用户认证
jenkins学习笔记之七:jenkins集成LDAP用户认证
|
4月前
|
消息中间件 Kafka Apache
Flink 提供了与 Kafka 集成的官方 Connector,使得 Flink 能够消费 Kafka 数据
【2月更文挑战第6天】Flink 提供了与 Kafka 集成的官方 Connector,使得 Flink 能够消费 Kafka 数据
103 2
|
2月前
|
XML 关系型数据库 MySQL
支付系统----微信支付19---集成MyBatis-plus,数据库驱动对应的依赖版本设置问题,5没版本没有cj这个依赖,mysql驱动默认的是版本8,这里是一个父类,数据库都有,写个父类,继承就行
支付系统----微信支付19---集成MyBatis-plus,数据库驱动对应的依赖版本设置问题,5没版本没有cj这个依赖,mysql驱动默认的是版本8,这里是一个父类,数据库都有,写个父类,继承就行
|
4月前
|
人工智能 自然语言处理 安全
构建未来:AI驱动的自适应网络安全防御系统提升软件测试效率:自动化与持续集成的实践之路
【5月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、保障用户隐私和企业持续运营的关键。传统的安全防御手段,如防火墙和入侵检测系统,面对日益复杂的网络攻击已显得力不从心。本文提出了一种基于人工智能(AI)技术的自适应网络安全防御系统,该系统能够实时分析网络流量,自动识别潜在威胁,并动态调整防御策略以应对未知攻击。通过深度学习算法和自然语言处理技术的结合,系统不仅能够提高检测速度和准确性,还能自主学习和适应新型攻击模式,从而显著提升网络安全防御的效率和智能化水平。 【5月更文挑战第30天】 在快速迭代的软件开发周期中,传统的手动测试方法已不再适应现代高效交付的要求。本文探讨了如
|
4月前
|
人工智能 NoSQL atlas
MongoDB白皮书|应用程序驱动型智能:定义下一代成功的现代应用程序
MongoDB Atlas 开发者数据平台旨在帮助这两个团队“乘风破浪”,从而打造更快、更智能的应用和自动化业务流程,能够更快地对快速变化的操作数据做出反应和响应。
3168 0
|
4月前
|
机器学习/深度学习
零基础入门语义分割-地表建筑物识别 Task6 模型集成-学习笔记
零基础入门语义分割-地表建筑物识别 Task6 模型集成-学习笔记
77 1
下一篇
DDNS