MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事
关于官方驱动集成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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示