前言

  最近闲的时间有点多,所以还是写博客吧。

  有人说Mongo 2.0的写法难以把控,好多地方不知道咋用,所以坚持用1.0(不愿意去尝试2.0),我感觉不可理解。所以写篇博客比较下。

  Mongo C#驱动1.0到2.0设计方面的差别非常大。

正文

先说1.0吧,更像是Mongo 各功能的直译,所以写法与mongo原生查询修改等比较类似,易上手。但是设计上确实存在很多问题。简单说几点:


a.在query的构建方面,虽然有问题,但是勉强能接受

  var modelCursor = collection.Find(
Query.And(Query.Matches("Name", "test"),Query.EQ("Age",),Query.In("id",new BsonArray(){"","","sda"})));
var modelCursor1 = collection.Find(
Query.And(Query<TestData>.Matches(t => t.Name, "test"), Query<TestData>.EQ(t=>t.Age, ), Query<TestData>.In(t=>t._id, new BsonArray() { "", "", "sda" })));

第一种方式代码简单,但是硬字符串比较多,万一改个字段,维护难度大

第二种方式代码维护性好,但是代码真是烦琐,每个query都要来个泛型约定,冗余太多了

b.大量linq方法与数据库中执行构建查询的方法混在一起,这点是可以改进的。否则可能出现一下问题:

在查询返回类型上MongoCursor<TDefaultDocument>。继承IEnumerable<T>,Find时只是构建查询而已,只有调用GetEnumerator()才回去数据库查询数据。也就是ToList()或者foreach的时候才去查询。这一点设计的没错跟ef一致的

执行方式,看看源码截图:

这样看起来没问题,但是在使用时,如下代码:

这是段常用的分页代码,我天真的以为他会将cursor.Skip().Take()生成查询去数据库中执行再把200条结果返回给我。但是实际情况不是这样的

其实已经把所有数据都拿出来了,只是在客户端使用了linq的Skip去跳过而已。

正确的用法是:

要使用cursor的Set开头的方法才是构建查询的。

如果你学ef那也学彻底点啊,不信你看ef查询时的Skip

人家把Skip Take都“重写”了好吧,根本没使用IEnumerable<T>的Skip。这一点想说明的,就是导致了大量的linq客户端执行的代码与Mongo服务端执行的代码混杂的问题

c.另外分组查询是设计非常不好的。比如:

请看GroupArgs的注释:

知道我写这么多注释,为啥吗,我怕过两天我也不知道咋用的了。更别说让其他同事用了。一个分组查询居然还要在c#中写原始的js代码来实现。所以驱动在这里的实现只是半成品的。

对比着再说说2.0吧,首先与时俱进大量采用了异步编程。然后对lamda表达式与强类型的支持都做了改进。


a.首先查询全部是lamda表达式了,这次算是把查询这块彻底本地化了。不用再去记住Mongo查询原生的语法了,门槛很低了。如:

b.重写了查询返回值类型,叫什么FindFluent。翻译过来就是可链式调用的东东,看看源码:

果然都是返回的this便于链式调用,再看看里面的方法:

2.0不再继承IEnumerable接口,里面的方法全部是自己实现的了,比如:

findFluent.Skip(10).Limit(10).SortBy(t => t.Age);使用起来顺手多了,而且都是到数据库端执行的.

就连取集合的First方法,也是经过服务端处理的,不信你看:

你再看看Single方法:

查询的时候都做了Limit处理,…………………………但是会不会突然心头一紧。怎么Single的时候find.Limit(2)啊,太奇怪了。不过聪明的小伙伴,想一会儿应该知道咋回事了,哈哈!

再看看分组查询优化,我就不说了,把c#里写js代码的部分直接搞掉了。使用lamda表达式的方式实现了,如下:

var dataGroup = collection.Aggregate().Group(t => t.Age, g => new { _id = g.Key, TotalAge = g.Sum(x => x.Age) });

需要注意的是2.0都是异步编程,熟悉下用法就行了,这也是.net4.5比较大的改变:把异步编程变得简单。

先写这么多了,那里说的不对的地方大家多多指出。另外身边有谁还坚持用1.0的,一定要尝试着去说服他……额……

.net Mongo Driver 1.0与2.0的对比与2.0的优化的更多相关文章

  1. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name

    今天使用docker运行mysql时报错, 执行命令: docker run --restart=always --name mysql5.7 -p 3306:3306 -v /data/mysql/ ...

  2. paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较

    paip.php 5.0 5.3 5.4  5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...

  3. 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  4. IIS 7.0、IIS 7.5 和 IIS 8.0 中的 HTTP 状态代码 转

    http://support.microsoft.com/kb/943891/zh-cn 日志文件位置 默认情况下,IIS 7.0.IIS 7.5 和 IIS 8.0 将日志文件放在以下文件夹中: i ...

  5. Centos7.0挂载优盘安装jdk1.7和tomcat7.0

    Centos7.0挂载优盘安装jdk1.7和tomcat7.0 前言: 笔者发现用wget方法直接在服务器下载jdk和tomcat速度很慢,而且jdk1.7用wget方法下载链接不好找,不如直接从官网 ...

  6. 在CUDA8.0下编译安装OpenCV3.1.0来实现GPU加速(Compiling OpenCV3.1.0 with CUDA8.0 support)

    在CUDA8.0下编译安装OpenCV3.1.0 一.本人电脑配置:ubuntu 14.04, NVIDIA GTX1060. 二.编译OpenCV3.1.0前,读者需要成功安装CUDA8.0(网上有 ...

  7. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

  8. .Net Core 2.0 生态(2).NET Core 2.0 特性介绍和使用指南

    .NET Core 2.0发布日期:2017年8月14日 前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路 ...

  9. .Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南

    .NET Standard 2.0 发布日期:2017年8月14日 公告原文地址 前言 早上起来.NET社区沸腾了,期待已久的.NET Core 2.0终于发布!根据个人经验,微软的产品一般在2.0时 ...

  10. 在 .NET Framework 4.0 的程序中使用 .NET Framework 2.0 的程序集

    场景 在 目标框架 为 .NET Framework 4 的程序中,引用 目标框架 为 .NET Framework 2.0 的程序集,并使用 .NET Framework 2.0 程序集中的类型或者 ...

随机推荐

  1. windows安装MySQL

    1)双击MySQL安装文件mysql-essential-5.0.82-win32.msi.进入欢迎页面. 单击Nextbutton.进入到安装类型页面. 2)在安装类型页面中的第一项是典型安装,第二 ...

  2. MSSQL2008数据库备份还原和数据恢复

    原文:MSSQL2008数据库备份还原和数据恢复   序言 一直想写一篇关于数据库备份与恢复的文章,但基于能力的有限对数据库认知的有限怕不足以准确的表达,最后思考很久还是决定把自己的一些理解写出来供大 ...

  3. .NET大型B2C开源项目nopcommerce解析——项目结构

    .NET大型B2C开源项目nopcommerce解析——项目结构 编写本文档是为了向程序员说明nopcommerce的解决方案结构,亦是程序员开发nopcommerce的居家必备良书.首先nopcom ...

  4. Effective C++(15) 在资源管理类中提供对原始资源的访问

      问题聚焦:     资源管理类是为了对抗资源泄露.     如果一些函数需要访问原始资源,资源管理类应该怎么做呢?        关于资源管理的概念总是显得那么的高大上,其实只是抽象一点. 下面用 ...

  5. SZU:G32 Mass fraction

    Judge Info Memory Limit: 32768KB Case Time Limit: 5000MS Time Limit: 5000MS Judger: Float Numbers (1 ...

  6. PLAN : 入门题目 ( update )

    更新后 step 1 : A07, A11, A12,A14,A15,A18,A22,A24,A25,A26 A27,A29,A31,A32,A34,A59,A66,A69,A84,B24 B45,B ...

  7. Lex Yacc手册

    Python Lex Yacc手册 本文是PLY (Python Lex-Yacc)的中文翻译版.转载请注明出处.这里有更好的阅读体验. 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不 ...

  8. 4 MySQL与PHP连接

    目录: 1. 连接概述2. 创建php文件进行MySQL连接3. 查看连接效果 1. 连接概述 上文讲述了LAMP开发模型,并且使用AppServ进行安装.这时候就要体现优势了.本节将介绍在直接使用P ...

  9. .NET里的行为驱动开发

    BDD (Given - When - then) Ruby Cucumber, Java FitNesse , Python RoboFramework, C# specflow nspec .NE ...

  10. [Usaco2008 Nov]Buying Hay 购买干草[背包]

    Description     约翰的干草库存已经告罄,他打算为奶牛们采购日(1≤日≤50000)磅干草.     他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重 ...