.net Mongo Driver 1.0与2.0的对比与2.0的优化

前言

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

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

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

正文

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



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

1  var modelCursor = collection.Find(
2                 Query.And(Query.Matches("Name", "test"),Query.EQ("Age",10),Query.In("id",new BsonArray(){"123","456","sda"})));
3 var modelCursor1 = collection.Find(
4                Query.And(Query<TestData>.Matches(t => t.Name, "test"), Query<TestData>.EQ(t=>t.Age, 10), Query<TestData>.In(t=>t._id, new BsonArray() { "123", "456", "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的,一定要尝试着去说服他……额……

时间: 2024-10-29 00:29:06

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

Oracle 10.2.0.5 RMAN迁移并升级11.2.0.4一例

一.环境介绍 1. 源数据库环境 操作系统版本: OEL 5.4 x64数据库版本  : 10.2.0.5 x64数据库sid名 : orcl Oracle 10g 10.2.0.5(64bit)安装目录如下: 数据库软件:/u01/app/oracle/product/10.2.0/db_1数据库文件:/u01/app/oracle/oradata/orcl 归档目录:/u01/archivelog RMAN目录:/backup/dbbak/orabak 背景:一个老oracle10g数据库,

菜品原价为0,说明菜品没有原价.菜品原价大于0,则显示菜品原价.并以删除线删去.每个菜品都是直接取的数据库字段.

菜品原价为0,说明菜品没有原价.菜品原价大于0,则显示菜品原价.并以删除线删去.每个菜品都是直接取的数据库字段. 1 <script type="text/javascript"> 2 function deletelinedisplay() { 3 var str_s = document.getElementById("DataList1").getElementsByTagName("s").length; 4 for (var

Oracle 11g(11.2.0.4)手动打补丁PSU(11.2.0.4.8)

一.准备工作 1,数据库环境操作系统版本   : Redhat 6.5 x64数据库版本     : Oracle 11.2.0.4 x64Oracle database: 11.2.0.4 2,准备内容OPatch : p6880880_112000_Linux-x86-64.zipDB PSU : p21352635_112040_Linux-x86-64.zip 仅单实例使用.OPatch下载地址:https://updates.oracle.com/download/6880880.ht

Chapter 1 : OpenGLES 3.0 简介 (2)—— OpenGL ES 3.0

管道 如前所属,本书讲解的API版本是OpenGL ES 3.0.本书的目标是,深入讲解OpenGL ES 3.0的技术细节,给出具体的例子来说明如何使用某个特性,并且讨论了各种性能优化技术.当您读完这本书,您应该可以对OpenGL ES 3.0API有一个很好的把握.您将可以轻松的写出让人新服的OpenGL ES 3.0的应用程序,并且您不必通过阅读多种OpenGL ES的规范来搞懂某个特性是如何工作的. OpenGL ES 3.0实现了可编程着色图形管道.OpenGL ES 3.0规范包含两

mongoDB的读书笔记(via3.0)(00)_【概览】(02)_mongoDB3.0中的mongod启动方式小试牛刀

mongod启动 本来想写Replica的非测试模式的集群架构的,但是实在是手痒痒,把mongoDB的3.0给download下来了,看了一两眼文档后决定还是先大概写一点点关于启动的话题,之后写Replica的时候基本上就用mongoDB 3.0的方式+YAML的 配置方式来做了. mongod利用mmapv1启动 这个是default的启动方式.mongod的启动参数多如牛毛,本来想有空总结一下的,我勒个去的,有些估计这辈子也用不到的场景也不知道如何写,等我再考虑一下再说吧. 准备配置文件 s

7、Cocos2dx 3.0游戏开发找小三之3.0版本的代码风格

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,许多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C 的

8、Cocos2dx 3.0游戏开发找小三之3.0版本的内存管理

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十分有限,内存尤为宝贵,开发者必须十分慎重地利用内存,避免不必要的消耗,更要防止内存泄漏. 基于 Cocos2d-iPhone 的 Objective-C风格的内存管理是 Cocos2d-x 的一个特色. 把 Objective-C 的内存管理方式引入 C++,使得游戏开发的内存管理难度下降了个层次.

Oasys Alp v19.2.0.3 1CD + Oasys Aspire 1.3.1.0 1CD

Oasys AdSec v8.2.1.63 1CD(专业的土工合成材料断面分析软件) Oasys Alp v19.2.0.3 1CD Oasys Aspire 1.3.1.0 1CD Nobeltec产品: AMC.GPS2CAD.v4.3.0.0 1CD GPS CAD Transfer v1.0 1CD (GPS辅助工具,可以将Magellan GPS路点转换成AutoCAD格式) GPS Tools SDK v2.11b 1CD GPS Trackmaker 4.9.550 1CD GPS

cocos2d-x3.0 编译android出现的问题笔记 &nbsp;cocos2dx3.0 Android.mk

1.编译时出现 No rule to make target 错误,尝试删除XXX/proj.android/obj/local/armeabi/objs这个文件夹. 2.android.mk正确写法 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp # 遍历目录及子目录的函数 define walk

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

Centos7.0挂载优盘安装jdk1.7和tomcat7.0 前言: 笔者发现用wget方法直接在服务器下载jdk和tomcat速度很慢,而且jdk1.7用wget方法下载链接不好找,不如直接从官网下载到优盘,避免以后都用wget方法龟速安装. 准备工具: 1.优盘一个 2.jdk和tomcat的包 步骤如下: 一.复制优盘的jdk和tomcat包   首先区分电脑是32位 or 64位的系统. uname -a 如上图包含x86_64的为64位的系统,没有则是32位的系统 1.插上带有携带j