C#版的mongodb最新的官方驱动2.4.0版本
已经升级了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版本的更多相关文章
- MongoDB学习笔记~官方驱动的原生Curd操作
回到目录 MongoDB的官方C#驱动,让我们使用起来也很方便,但对于Linq开发人员来说,可能有些不了解,所以,我还是将官方驱动进行了二次封装,而对于一个比较个性化的mongo操作,使用我封装的也很 ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三
本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一
本人系新接触MongoDB不久,属于MongoDB的菜鸟范畴.在使用MongoDB的过程中,总结了一些认识,在此总结跟大家分享.欢迎拍砖. 关于MongoDB的内容,在此就不做介绍了,网上有浩如烟海的 ...
- MySQL的JDBC驱动(8.0版本)
1.引用外部库 mysql-connector-java-8.0.版本的jar 2.jdbc驱动类:com.mysql.jdbc.Driver 改成 com.mysql.cj.jdbc.Drive ...
- MongoDB学习笔记~官方驱动嵌套数组对象的更新
回到目录 对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 二
本次改动的主要内容是实现MongoDB.Repository对MongoDBRef的支持. MongoDB对一对一,一对多,多对多关系的维护,官方推荐文档嵌入方式,反映到模型的设计如下: public ...
- MongoDB的C#官方驱动InvalidOperationException异常的解决办法
异常情况描述 有一个“文章”类,其中包含一个“List<段落>”类型的属性,“段落”类是抽象类,其子类有“副标题段落”.“文本段落”.“图像段落”.“附件段落”.“列表段落”等类型. 将“ ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作
本次主要内容:修正MongoDB.Repository框架对多数据库的支持. 在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路.之前是考虑MongoDB.Repos ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 五 --- 为List<MongoDBRef>增加扩展方法
本次改动主要内容:为List<MongoDBRef>增加扩展方法 在MongoDB.Repository的使用过程中,发现在一个类中只定义一个List<MongoDBRef>是 ...
随机推荐
- function方法中this的用法
jsp<select class="mokuai2" onchange="Mokuai2Change(this.value)"></selec ...
- Evolutionary Computing: 5. Evolutionary Strategies(2)
Resource: Introduction to Evolutionary Computing, A.E.Eliben Outline recombination parent selection ...
- 关键字volatile
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存 ...
- svn 版本控制
首先来下载和搭建SVN服务器. Subversion已经迁移到apache网站上了,下载地址: http://subversion.apache.org/packages.html windows操作 ...
- wireshark常用命令
Wireshark 基本语法,基本使用方法,及包过虑规则: 1.过滤IP,如来源IP或者目标IP等于某个IP 例子: ip.src eq 192.168.1.107 or ip.dst eq 19 ...
- python3 实现简单信用卡管理程序
1.程序执行代码: #Author by Andy #_*_ coding:utf-8 _*_ import os,sys,time Base_dir=os.path.dirname(os.path. ...
- 高德地图JavaScript开发
项目需求:标注一个或者两个点.显示信息窗体.自定义icon <!DOCTYPE html> <html lang="en"> <head> &l ...
- js刷新框架子页面的七种方法代码
面以三个页面分别命名为framedemo.html,top.html,button.html为例来具体说明如何做.其中framedemo.html由上下两个页面组成,代码如下: <!DOCTYP ...
- lua实现私有函数
本文是原创文章,如需转载,请注明文章出处 要用lua实现私有函数,关键就是使用metatable的特性来实现. Test.lua: local v = {};v.x = 100;v.y = 200; ...
- SSH遇见的问题
Gtk-WARNING **: cannot open display: 在从bitbucket仓库向linux服务器clone项目的时候出现了一个问题: ): Gtk-WARNING **: can ...