已经升级了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. XMLHttpRequest.status状态码

    XMLHttpRequest.status状态码1xx-信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. 100-继续. 101-切换协议. 2xx-成 ...

  2. 【java基础】成员变量和局部变量02

    成员变量和局部变量(2) 成员变量的初始化和内存中的运行机制         当系统加载类或者创建类的实例的时候,系统会自动为成员变量分配内存空间,并自动指定初始值. package object; ...

  3. 使用cocos2d-x c++ Android静态库

    在用cocos2d-x做Android开发时,每次clean后都会需要再次编译coco2d-x的库,十分耗时. 这里给出一个直接使用静态库而不用每次都编译源码的方法: 1\ 首先找到一个cocos2d ...

  4. Codility Tree Height

    public class HeightOfTreeSolution { static int height=-1; public int solution(Tree T) { // write you ...

  5. log4net RemotingAppender 的配置

    Before you even start trying any of the alternatives provided, ask yourself whether you really need ...

  6. SQL SERVER 2005 DBCC IND命令说明

    每天笑一笑,烦恼少一倍 轻松一笑!狗狗被调戏:http://947kan.com/video/player-52952-0-0.html ------------------------------- ...

  7. HEAD FIRST HTML & CSS学习笔记

    CSS部分 1. border-bottom属性控制元素下边框的外观.   eg: border-bottom:1px solid maroon;  P265 下划线 text-decoration: ...

  8. zoom和transform:scale的区别

    小tips: zoom和transform:scale的区别 这篇文章发布于 2015年11月3日,星期二,00:52,归类于 css相关. 阅读 7876 次, 今日 8 次 by zhangxin ...

  9. UIKit框架

    在今后的应用程序构建中,会陆续使用各式各样的控件,因此UIKit框架的引入是必不可少的! 一.简介 UIKitk框架提供一系列的Class(类)来建立和管理iPhone OS应用程序的用户界面接口.应 ...

  10. golang mgo的mongo连接池设置:必须手动加上maxPoolSize

    本司礼物系统使用了golang的 mongo库 mgo,中间踩了一些坑,总结下避免大家再踩坑 golang的mgo库说明里是说明了开启连接复用的,但观察实验发现,这并没有根本实现连接的控制,连接复用仅 ...