已经升级了mongodb至最新的3.4的版本,我想想也该把驱动升到最新的了,我用的驱动还是1.7的版本呢,之前几次想升级,都是因为升级驱动需要改动的代码太大了,升级的成本很高,所以懒得动,就这么的用了几年了。但是现在出了很多新功能,如果不升级的话,根本用不了,比如Lookup等功能。想想咬牙就升级了。驱动DLL一换,就发现代码全报错了。以前的IMongoQuery等方法全用不了的。有一些方法也不见了,在修改的过程中,只能写边修改边写代码测试,一个一个测试它提供的新方法。等了解了新的驱动后,觉得改动还是非常大的,将Query,Update等都集成到了一个叫Builders的类中了,把Update中有关SetWrapped的方法全删了,最后试了半天,才发现,SetWrapped的方法,可以直接用新方法中的Set就可以搞定了,而AddToSetWrapped方法只需要用AddToSet方法就行了。

带给我的最大震憾是,新的写法可以完全用LINQ搞定,终于不用再去管mongodb的那个实体类的映射了,在操作中,完全用类的字段就可以搞定,我把的一个类的方法贴出来供大家参考一下。

    public class Content
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("t")]
public string Title { get; set; } [BsonElement("d")]
public string Detail { get; set; } [BsonElement("a")]
public string Author { get; set; } [BsonElement("ct")]
public double CreateTime { get; set; } [BsonElement("click")]
public int Click { get; set; } [BsonElement("img")]
public string Img { get; set; } [BsonElement("f")]
public bool IsFinished { get; set; } [BsonElement("type")]
public int Type { get; set; }
}

老的操作类的土鳖方法是这样的

   public class ContentInfo : DBBase
{
public static void InsertContent(string title, string detail, string author, string img, int type)
{
Content k = new Content
{
Author = author,
Detail = detail,
Img = img,
Title = title,
Click = ,
Type = type,
CreateTime = ((DateTime.Now.ToUniversalTime().Ticks - ) / )
};
try
{
var collection = _database.GetCollection<Content>("content");
collection.Insert(k);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} public static void UpdateContent(string id, string title, string detail, string author, string img, int type)
{
var collection = _database.GetCollection<Content>("content");
IMongoQuery query = Query.EQ("_id", new ObjectId(id));
UpdateBuilder up = new UpdateBuilder();
up.Set("t", title);
up.Set("d", detail);
up.Set("a", author);
up.Set("img", img);
up.Set("type", type);
collection.Update(query, up, UpdateFlags.Upsert);
} public static Content Get(string id)
{
var collection = _database.GetCollection<Content>("content");
IMongoQuery query = Query.EQ("_id", new ObjectId(id));
IMongoUpdate update = Update.Inc("click", );
collection.Update(query, update);
var results = collection.FindOneAs<Content>(query);
return results;
}
public static List<Content> GetContentList(int pageIndex, int pageSize, out int count, bool isShow = true)
{ var collection = _database.GetCollection<Content>("content");
IMongoQuery query = Query.GT("click", -);
if (isShow)
{
query = Query.And(query, Query.EQ("f", true));
} SortByDocument sort = new SortByDocument { { "ct", - } };
var num = collection.Count(query);
count = Convert.ToInt32(num);
var results = collection.FindAs<Content>(query).SetSortOrder(sort).SetSkip((pageIndex - ) * pageSize).SetLimit(pageSize);
return results.ToList(); } public static List<Content> GetContentTypeList(int type, int pageIndex, int pageSize, out int count)
{ var collection = _database.GetCollection<Content>("content");
IMongoQuery query = Query.GT("click", -); query = Query.And(query, Query.EQ("f", true));
query = Query.And(query, Query.EQ("type", type)); SortByDocument sort = new SortByDocument { { "ct", - } };
var num = collection.Count(query);
count = Convert.ToInt32(num);
var results = collection.FindAs<Content>(query).SetSortOrder(sort).SetSkip((pageIndex - ) * pageSize).SetLimit(pageSize);
return results.ToList(); } public static List<Content> GetContentSiteMap()
{
var collection = _database.GetCollection<Content>("content");
IMongoQuery query = Query.GT("click", -); query = Query.And(query, Query.EQ("f", true)); SortByDocument sort = new SortByDocument { { "ct", - } };
FieldsDocument fd = new FieldsDocument();
fd.Add("d", );
var results = collection.FindAs<Content>(query).SetFields(fd).SetSortOrder(sort);
return results.ToList();
} public static void UpdateContentTrue(string id)
{
var collection = _database.GetCollection<Content>("content");
IMongoQuery query = Query.EQ("_id", new ObjectId(id));
UpdateBuilder up = new UpdateBuilder();
up.Set("f", true);
up.Set("ct", ((DateTime.Now.ToUniversalTime().Ticks - ) / ));
collection.Update(query, up, UpdateFlags.Upsert);
}
  }

而新的方法是这样的:

   public class ContentInfo : DBBase
{
public static void InsertContent(string title, string detail, string author, string img, int type)
{
Content k = new Content
{
Author = author,
Detail = detail,
Img = img,
Title = title,
Click = ,
Type = type,
CreateTime = ((DateTime.Now.ToUniversalTime().Ticks - ) / )
};
try
{
var collection = _database.GetCollection<Content>("content");
collection.InsertOne(k);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} public static void UpdateContent(string id, string title, string detail, string author, string img, int type)
{
var collection = _database.GetCollection<Content>("content");
var filter = Builders<Content>.Filter.Eq(x => x.Id, new ObjectId(id));
var up = Builders<Content>.Update
.Set(x => x.Title, title)
.Set(x => x.Detail, detail)
.Set(x => x.Author, author)
.Set(x => x.Img, img)
.Set(x => x.Type, type); collection.UpdateOneAsync(filter, up);
} public static Content Get(string id)
{
var collection = _database.GetCollection<Content>("content");
var filter = Builders<Content>.Filter.Eq(x => x.Id, new ObjectId(id));
var up = Builders<Content>.Update.Inc(x => x.Click, );
var results = collection.FindOneAndUpdate(filter, up);
return results;
}
public static List<Content> GetContentList(int pageIndex, int pageSize, out int count, bool isShow = true)
{ var collection = _database.GetCollection<Content>("content"); var builder = Builders<Content>.Filter;
var filter = builder.Gt(x => x.Click, -); if (isShow)
{
filter = builder.And(filter, builder.Eq(x => x.IsFinished, true));
} var sort = Builders<Content>.Sort.Descending(x => x.CreateTime); var num = collection.Count(filter);
count = Convert.ToInt32(num);
var results = collection.Find(filter).Sort(sort).Skip((pageIndex - ) * pageSize).Limit(pageSize);
return results.ToList(); } public static List<Content> GetContentTypeList(int type, int pageIndex, int pageSize, out int count)
{ var collection = _database.GetCollection<Content>("content");
var filter = Builders<Content>.Filter.Where(x => x.Click > - && x.IsFinished == true && x.Type == type); var sort = Builders<Content>.Sort.Descending(x => x.CreateTime); var num = collection.Count(filter);
count = Convert.ToInt32(num);
var results = collection.Find(filter).Sort(sort).Skip((pageIndex - ) * pageSize).Limit(pageSize);
return results.ToList(); } public static List<Content> GetContentSiteMap()
{
var collection = _database.GetCollection<Content>("content");
var filter = Builders<Content>.Filter.Where(x => x.Click > - && x.IsFinished == true); var sort = Builders<Content>.Sort.Descending(x => x.CreateTime); var project = Builders<Content>.Projection.Exclude(x => x.Detail); var results = collection.Find(filter).Project<Content>(project).Sort(sort);
return results.ToList();
} public static void UpdateContentTrue(string id)
{
var collection = _database.GetCollection<Content>("content");
var filter = Builders<Content>.Filter.Eq(x => x.Id, new ObjectId(id));
var up = Builders<Content>.Update
.Set(x => x.IsFinished, true)
.Set(x => x.CreateTime, ((DateTime.Now.ToUniversalTime().Ticks - ) / )); var results = collection.FindOneAndUpdate(filter, up);
} }

新的里面已经完全看不到了mongodb数据库中的字段名了,完全可以用lambda表达式完成这些操作了,对程序员来说,操作简便了,不需要再去对照映射关系了,也降低了一些程序员的入门门槛,有些基础的操作,程序员甚至不需要了解mongodb,只要会写LINQ就可以完成了。这么多的好处,我觉得将数据库和驱动都升级到最新版还是挺值的。但是注意,1.X版本的驱动和2.X版本的驱动是完全不一样的,是破坏性升级,如果想要更换这个驱动,代码是一定要重新写的,所以大家也别光看到好处,也要计算一下成本。

C#版的mongodb最新的官方驱动2.4.0版本的更多相关文章

  1. MongoDB学习笔记~官方驱动的原生Curd操作

    回到目录 MongoDB的官方C#驱动,让我们使用起来也很方便,但对于Linq开发人员来说,可能有些不了解,所以,我还是将官方驱动进行了二次封装,而对于一个比较个性化的mongo操作,使用我封装的也很 ...

  2. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三

    本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...

  3. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一

    本人系新接触MongoDB不久,属于MongoDB的菜鸟范畴.在使用MongoDB的过程中,总结了一些认识,在此总结跟大家分享.欢迎拍砖. 关于MongoDB的内容,在此就不做介绍了,网上有浩如烟海的 ...

  4. MySQL的JDBC驱动(8.0版本)

    1.引用外部库  mysql-connector-java-8.0.版本的jar 2.jdbc驱动类:com.mysql.jdbc.Driver  改成 com.mysql.cj.jdbc.Drive ...

  5. MongoDB学习笔记~官方驱动嵌套数组对象的更新

    回到目录 对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp ...

  6. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二

    本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持. MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下: public ...

  7. MongoDB的C#官方驱动InvalidOperationException异常的解决办法

    异常情况描述 有一个“文章”类,其中包含一个“List<段落>”类型的属性,“段落”类是抽象类,其子类有“副标题段落”.“文本段落”.“图像段落”.“附件段落”.“列表段落”等类型. 将“ ...

  8. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作

    本次主要内容:修正MongoDB.Repository框架对多数据库的支持. 在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路.之前是考虑MongoDB.Repos ...

  9. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法

    本次改动主要内容:为List<MongoDBRef>增加扩展方法 在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是 ...

随机推荐

  1. Visual Studio最常用、最高效的快捷键

    查了一些VS编程的快捷键,大家共同学习,共同进步! 1.强迫智能感知:Ctrl+J.智能感知是Visual Studio最大的亮点之一,选择Visual Studio恐怕不会没有这个原因. 2.强迫显 ...

  2. 转:图解Git[强烈推荐]

    https://my.oschina.net/xdev/blog/114383 再次感谢原著作者和中文翻译者. 此页图解git中的最常用命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透 ...

  3. mac环境brew安装freetype,imagick等yii2所需要的库

    之前整理了一下内置的php环境,各种缺库是很坑爹的,而且内置的php编译目录找了老半天没找到.所以决定使用brew去重新编译一边php brew的安装就不说了,上篇博客有说.直入主题 brew安装完p ...

  4. java.lang.Class<T> -- 反射机制

    1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  5. android intent和intent action大全

    1.Intent的用法:(1)用Action跳转1,使用Action跳转,如果有一个程序的AndroidManifest.xml中的某一个 Activity的IntentFilter段中 定义了包含了 ...

  6. 分枝定界的matlab实现

    function [optSolution,optValue,exists]=BranchBound(c,A,b) % 分支定界法 % 整数规划问题标准型 % min c'*x % s.t. % A* ...

  7. EasyUI combobox 下拉高度自适应

    要指出的是,combobox是继承自combo的,所以,combo的属性也可以被combobox使用,该问题也是这样产生的,知道这个原理,该问题就解决一半了,另一点要指出的是,在easyui中,num ...

  8. Python【7】-数据分析准备

    一.经常用到的python库: Numpy:Python科学计算的基础包: pandas:提供了能使我们快捷的处理结构化数据的大量数据结构和函数: matplotlib:用于绘制数据图表的python ...

  9. img的onerror事件(瑕疵+解决办法)【转】

    显示图片的时候,为了更好的用户体验,可能会把一些没有图片的内容也用图片样式显示出来,此时我们就要用到IMG的onerror事件了,注意MyEclipse的快捷键alt+/是没有的. < img ...

  10. jsessionid 导致重定向404的问题

    http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletResponse.html#encod ...