已经升级了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. webbench---linux压测工具

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好用,安装使用也特别方便,并且非常小. 1.适用系统:Linux-CentOs 2.编译安 ...

  2. VNC SERVER配置

    vnc的配置网上有很多 普通用户的配置没有怎么写 根据下面这个说法 https://www.digitalocean.com/community/tutorials/how-to-install-an ...

  3. linux笔记:shell编程-文本处理命令

    cut(字段提取命令,也叫列提取命令): printf(格式化输出命令): awk(awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理): sed(sed是一个很好 ...

  4. ES6(一)ECMAscript6介绍

    nvm-windows Node.js是JavaScript语言的服务器运行环境,对ES6的支持度比浏览器更高.通过Node,可以体验更多ES6的特性.建议使用版本管理工具nvm,来安装Node,因为 ...

  5. 原生javascript实现省市区三级联动

    腾讯IP分享计划(http://ip.qq.com/)有个现成的三级联动功能,查看源码后发现可以直接使用其单独的JS文件(http://ip.qq.com/js/geo.js). 分析后发现自己需要写 ...

  6. 张艾迪:全面开放“A"计划

    全面开放A计划.放飞梦想.放飞世界 AOOOiA.global将全面开启"A"计划.与世界分享We Share .与世界一同探索求知.全面开放"A"计划:拉近世 ...

  7. JS 面向对象、prototype原型的克隆

    JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...

  8. 关于jQuery事件绑定

    转自:http://www.cnblogs.com/gaojun/p/3497582.html html: <a href="#" onclick="addBtn( ...

  9. 30 天精通 Git 版本控管

    https://github.com/doggy8088/Learn-Git-in-30-days

  10. shell脚本中的几个括号总结(小括号/大括号/花括号)--from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html

    在Shell中的小括号,大括号结构和有括号的变量,命令的用法如下: 1.${var}2.$(cmd)3.()和{}4.${var:-string},${var:+string},${var:=stri ...