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 = 0,
                Type = type,
                CreateTime = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000)
            };
            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", 1);
            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", -100);
            if (isShow)
            {
                query = Query.And(query, Query.EQ("f", true));
            }

            SortByDocument sort = new SortByDocument { { "ct", -1 } };
            var num = collection.Count(query);
            count = Convert.ToInt32(num);
            var results = collection.FindAs<Content>(query).SetSortOrder(sort).SetSkip((pageIndex - 1) * 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", -100);

            query = Query.And(query, Query.EQ("f", true));
            query = Query.And(query, Query.EQ("type", type));

            SortByDocument sort = new SortByDocument { { "ct", -1 } };
            var num = collection.Count(query);
            count = Convert.ToInt32(num);
            var results = collection.FindAs<Content>(query).SetSortOrder(sort).SetSkip((pageIndex - 1) * pageSize).SetLimit(pageSize);
            return results.ToList();

        }

        public static List<Content> GetContentSiteMap()
        {
            var collection = _database.GetCollection<Content>("content");
            IMongoQuery query = Query.GT("click", -100);

            query = Query.And(query, Query.EQ("f", true));

            SortByDocument sort = new SortByDocument { { "ct", -1 } };
            FieldsDocument fd = new FieldsDocument();
            fd.Add("d", 0);
            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 - 621355968000000000) / 10000000));
            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 = 0,
                Type = type,
                CreateTime = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000)
            };
            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, 1);
            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, -100);

            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 - 1) * 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 > -100 && 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 - 1) * 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 > -100 && 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 - 621355968000000000) / 10000000));

            var results = collection.FindOneAndUpdate(filter, up);
        }

    }

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

时间: 2024-11-06 08:37:27

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

MySQL的JDBC驱动(8.0版本)

1.引用外部库  mysql-connector-java-8.0.版本的jar 2.jdbc驱动类:com.mysql.jdbc.Driver  改成 com.mysql.cj.jdbc.Driver 3.jdbcUrl:jdbc:mysql://{ip}:{port}/{db}?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true 原文地址:https://www

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

回到目录 对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp驱动是不支持的,今天要说的就是如何让它支持子数组的更新,下面是我给出的数据结构 在Mongodb的Csharp驱动里,一般的更新方法如下 update = new UpdateDocument {{ "$set", new BsonDocument("OrderList.$.Us

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

异常情况描述 有一个“文章”类,其中包含一个“List<段落>”类型的属性,“段落”类是抽象类,其子类有“副标题段落”.“文本段落”.“图像段落”.“附件段落”.“列表段落”等类型. 将“文章”类型的对象存入MongoDB数据库完全没问题,但是从数据库取回则会引发这样的异常: [InvalidOperationException: 无法创建抽象类的实例.] 解决方法 之前曾就此问题向 magicDict 请教过,他给出的办法是参照这篇博文:http://www.cnblogs.com/zlp5

编译Qt5.0连接MySql5.5数据库的驱动(5.0版本的编译,我记得5.2开始自带了)

第一步 1.准备好Mysql数据库安装文件,Qt5.0完整的离线安装包,以及Qt5.0的完整的源代码.安装好程序,假设Mysql的安装路径为:C:\MySQL5.5,Qt5.0的安装路径:C:\Qt\Qt5.0.0-rc2\5.0.0-rc2,而Qt5.0的解压路径为:C:\Qt\qt-5.0.1-src. 注意事项:(1)安装mysql数据库的时候,网上很多教程说要选择自定义安装,并把lib和include这个选项选上.其实这个并不重要.因为我机器上很久前装mysql时选的是typical安装

AEAI WX 微信扩展框架 V1.0 版本发版说明

AEAI WX 微信扩展框架是基于 Java 封装的微信公众号二次开发框架,基于该框架可以快速接入微信,实现自定义菜单创建.信息按规则自动回复.集成企业的线上系 统(HR.CRM.微店.网站等).同时可以整合集成互联网开放资源(如:百度地图.天气预报.热映电影等). 本次发版的AEAI WX 微信扩展框架为v1.0版本,该产品现已开源并上传至开源中国,产品下载地址:http://pan.baidu.com/s/1ntsXKCT,欢迎大家下载使用,也可以加入数通畅联产品QQ技术群 29971983

在.net下打造mongoDb基于官方驱动最新版本

还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图. 总的来说比较蛋疼,因为从来没有使用过mongoDB,从安装,到转为windows服务,设置权限等等,好吧这都是题外话. 在写这个MongoDB版本的时候遇到的一些问题,我先总结下: 1.MongoDb版本是官网最新版3.4.4,官方驱动为2.4.3,首先我的项目是以GUID做为主键,在往MongonDB中插入时遇到的是

在C#中使用官方驱动操作MongoDB

MongoDB的官方驱动下载地址:https://github.com/mongodb/mongo-csharp-driver/releases 目前最新的版本是2.10,支持.NET 4.5以上.由于我现在的程序还在.NET4.0上面构建,所以这里使用1.10.1版本. 添加引用 解压下载到的驱动,然后在我们的程序中添加引用: MongoDB.Bson.dll MongoDB.Driver.dll 然后在代码中添加Using: using MongoDB.Bson; using MongoDB

MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事

回到目录 关于官方驱动集成IQueryable之后的一些事,有好事也有坏事,好事就是它会将你的linq语句非常友好的翻译成MongoDB语句,而坏事就是有一些linq语句不会被翻译,不会被翻译的代价就是将整个结果集装到内存,然后进行linq to object的查询,效率自然是非常低的,呵呵. 好事 最新官方驱动中,添加了对IQueryable扩展方法的支持 public static IMongoQueryable<TDocument> AsQueryable<TDocument>

MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是跟着.net走的正方向,大事所趋,但有时,我们的前台已经使用同步方式实现了,为了不改变前台代码,所以,后台的异步版本可能不是我们所需要的,所以,我们需要将它进行一些改造,把异步改为同步,即主线程等待异步方法执行结束后,再进行下面的代码,这样,可以保证方法的正确性. 由于insert,update,delete