冲C#的MongoDB数据库开发应用(1)–MongoDB数据库的基础知识和以

于花了无数岁月研究上了MongoDB数据库的连带知识,以及使用C#本着MongoDB数据库的包装、测试用后,决定花有日子来总结一下近年来底钻研心得,把这个数据库的用单独作为一个系列来介绍,希望于各个方面来总结并记录转这个新型、看似神秘之数据库使用过程。本文是其一系列之开业,主要介绍一些MongoDB数据库的基础知识、安装过程、基础运用相当地方。

MongoDB是一样舒缓由C++编写的大性能、开源、无模式之常用非关系型数据库产品,是非关系数据库当中作用最丰富、最像关系数据库的数据库。它扩展了涉项目数据库的诸多效应,例如:辅助索引、范围查询、排序等。 

MongoDB主要解决之是海量数据的拜访效率问题,它当做分布式数据崛起后,使用于多之同款不组织数据库,必然产生夫值得称颂的远在,它的第一成效特色如下:

        1)面向集的储存,适合储存对象以及JSON形式之数。
       
2)动态查询,MongoDB支持添加的查询表达式。查询指令下JSON形式之符,可轻易查询文档中内嵌的靶子以及数组。
       
3)完整的目支持,包括文档内嵌对象及数组。MongoDB的查询优化器会分析查询表达式,并生成一个高速的查询计划。
        4)查询监视,MongoDB包含一个监工具用于分析数据库操作的性质。
       
5)复制和机关故障转移,MongoDB数据库支持服务器之间的数码复制,支持主-从模式和服务器之间的竞相复制。复制的重点目标是供冗余及机关故障转移。
       
6)高效的民俗存储方,支持二进制数据与重型对象(如图或视频)。
       
7)自动分片以支持出口级别之伸缩性,自动分片功能支持水平的数据库集群,可动态添加额外之机器。 

1、MongoDB数据库和人情关系数据库的相比

MongoDB数据库来几乎独简单的定义需要了解一下。

 

    1)MongoDB中的 database 有着和咱们熟知的”数据库”一样的概念 (对
Oracle 来说就是 schema)。一个 MongoDB
实例中,可以产生零个或多只数据库,每个都作一个高级容器,用于存储数据。

    2)数据库中得以起零个或多单 collections (集合)。集合和传统意义上的
table 基本一致,可以简单的拿双边看成是千篇一律的东西。

   
3)集合是由于零个或多独 documents (文档)组成。同样,一个文档可以作为是同样 row

   
4)文档是由零个或多只 fields (字段)组成。,对应之尽管是关系数据库的 columns

    5)Indexes (索引)在 MongoDB
中饰演着同她当 RDBMS 中同样的角色,都是为增进查询的频率。

   
6)Cursors (游标)和方的五只概念都无一样,但是其特别重大,并且经常吃忽略,其中最为要的您要明白的一点是,游标是当你问
MongoDB
拿多少的时段,它会受您回到一个结出集的指针而不是的确的数,这个指针我们受其游标,我们得拿游标做我们想做的别工作,比如说计数或者跨行之类的,而无论是需将真的的多寡拖下去,在真的多寡达操作。

 它们的对待关系图如下所示。

图片 1

数量在Mongodb里面还是因Json格式方式开展仓储的,如下所示是中的一个记下内容。

{
    _id: ObjectID('4bd9e8e17cefd644108961bb'),
    name:'Vivek',
    class : '12th',
    subjects: [ 'physics', 'chemistry', 'math', 'english', 'computer'],
    address: {
                    house_no: '12B',
                    block: 'B',
                    sector: 12,
                    city : 'noida',
                    },
    grade: [
                    {
                    exam: 'unit test 1',
                    score: '60%'
                    },
                    {
                    exam: 'unit test 2',
                    score: '70%'
                    }

                ]                
}

当过去底死丰富一段时间中,关系项目数据库一直是无限主流的数据库解决方案,他使用真实世界中东西与关系来分解数据库被架空的多寡架构。然而,在信息技术爆炸式发展之今天,大数量现已化为了继云计算,物联网后乍的技术革命,关系项目数据库在拍卖非常数据量时曾初步犯难,开发者只能通过持续地优化数据库来解决数据量的题材,但优化毕竟非是一个长远方案,所以人们提出了同样栽新的数据库解决方案来接大数量时代的到来——NoSQL(非关系型数据库),其中MongoDB数据库就是内部的NoSQL的杰出代表。在深数额时代中,大数据量的拍卖都改成了勘查一个数据库最紧要的原由有。而MongoDB的一个根本目标即尽可能的让数据库保持一流的特性,这可怜挺程度地决定了MongoDB的统筹。

冲MongoDB官网的征,MongoDB的适用场景如下:

1)网站实时数据:MongoDB非常适合实时的插,更新与查询,并有着网站实时数据存储所待的复制与高度伸缩性。

2)数据缓存:由于性能好高,MongoDB也合乎当信息基础设备的休养存层。在系更开之后,由MongoDB搭建之持久化缓存层可以免下层之数据源过载。

3)大尺寸、低价值数存储:使用传统的涉项目数据库存储一些数量常常或者会见较值钱,在此之前,很多早晚程序员往往会择传统的文件进行仓储。

4)高伸缩性场景:MongoDB非常适合由数十还是数百高服务器组成的数据库。MongoDB的路径图中早已包含对MapReduce引擎的嵌入支持。

*5)对象要JSON数据存储:MongoDB的BSON数据格式非常适合文档化格式的储存和查询。*

MongoDB莫入下状况如下:
1)高度事务性系统:例如银行或会计系统。传统的关系项目数据库目前还是双重适用于得大量原子性复杂工作的应用程序。

2)传统的商业智能应用:针对特定问题之BI数据库会对生高度优化的查询方式。
3)需要复杂SQL查询的题目。

MongoDB大多数情况下,可以取代关系项目数据库实现数据库业务。它再简短又直接、更便捷又普通对应用开发者的封锁更不见,不过缺乏工作支持待慎重考虑业务要。

 

2、MongoDB数据库的装及基础运用

MongoDB数据的官网也:https://www.mongodb.org/,当前版本为3.2,可以直接下载安装版本在Linux或者Windows进行安装。

相似以Windows,我们默认安装之路为C:\Program
Files\MongoDB,安装后方可手动创建一个停放数据库和日志文件之目,一般不要放在C盘就好,如下所示:

创文件夹d:\mongodb\data\db、d:\mongodb\data\log,分别用来设置db和日志文件,我们下运行数据库后,这个目录就因故来放我们创建的数据库和日志资源了。

貌似我们安后,为了当命令执行方便调用Mongodb的一声令下,我们得安装一个大局的途径变量,如下所示。

图片 2

默认情况下,mongodb的干活模式,是启动一个DOS窗口,运行mongodb的数据库服务,一旦这个DOS窗口关闭,也就是告一段落了相关的劳务,在Windows平台,我们得以将她寄宿在Windows服务中,让其就系统的启航而启动,也不要为误关闭窗口要告一段落了数据库服务了。

经过下发号施令执行执行数据库服务之处理。

mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --install --serviceName "MongoDB"

下一场下命令执行启动服务

NET START MongoDB

图片 3

创建服务并顺利起步成功后,然后就足以以网的劳务列表里查看到了,我们肯定将她装也电动启动的Windows服务即可。

图片 4

开行后,我们得以在系统【运行】里面一直以命令mongo打开窗口就好展开连锁的操作了。

图片 5

点用了有些大面积的授命操作。

  • show dbs    显示数据库列表
  • use dbname    进入dbname数据库,大小写敏感,没有是数据库也没关系
  • show collections    显示数据库被的汇聚,相当给表格
  • db.<collection_name>.find();
    集合查找法,参考上面的点子,使用pretty()函数是排版更好看的意。

 而里边find方法好强大,可以组成很多条件查询的方,如下所示:

  • db.collection.find({ “key” : value })    查找key=value的数据
  • db.collection.find({ “key” : { $gt: value } })    key > value
  • db.collection.find({ “key” : { $lt: value } })    key < value
  • db.collection.find({ “key” : { $gte: value } })    key >= value
  • db.collection.find({ “key” : { $lte: value } })    key <= value
  • db.collection.find({ “key” : { $gt: value1 , $lt: value2 } })  
     value1 < key <value2
  • db.collection.find({ “key” : { $ne: value } })    key <> value
  • db.collection.find({ “key” : { $mod : [ 10 , 1 ] } })  
     取模运算,条件相当给key % 10 == 1 便key除因10余勤为1底
  • db.collection.find({ “key” : { $nin: [ 1, 2, 3 ] } })  
     不属,条件相当给key的值未属[ 1, 2, 3 ]遭到其他一个
  • db.collection.find({ “key” : { $in: [ 1, 2, 3 ] } })  
     属于,条件相当给key等于[ 1, 2, 3 ]遭遇任何一个
  • db.collection.find({ “key” : { $size: 1 } })    $size
    数量、尺寸,条件相当给key的价的数据是1(key必须是数组,一个值的状况不能够算是数量为1之数组)
  • db.collection.find({ “key” : { $exists : true|false } })    $exists
    字段有,true返回存在字段key的多寡,false返回不设有字度key的数据
  • db.collection.find({ “key”: /^val.*val$/i })  
     正则,类似like;“i”忽略大小写,“m”支持多行
  • db.collection.find({ $or : [{a : 1}, {b : 2} ] })    $or或
    (注意:MongoDB
    1.5.3晚本可用),符合条件a=1的要么符合条件b=2的多少都见面询问出来
  • db.collection.find({ “key”: value , $or : [{ a : 1 } , { b : 2 }]
    })    符合条件key=value ,同时称其他两单标准被自由一个之数
  • db.collection.find({ “key.subkey” :value })  
     内嵌对象吃之价值相当,注意:”key.subkey”必须加引号
  • db.collection.find({ “key”: { $not : /^val.*val$/i } })  
     这是一个跟另外查询条件做使用的操作符,不见面独自使用。上述查询条件得到的结果集加上$not之后便会赢得相反的会师。

自然还有插入更新的处理语句为是殊特别的。

db.student.insert({name:'student1',subject:['arts','music']})

特意是翻新操作需要证实一下,支持常规的$set方法(修改)、$unset方法(移除指定的键),还有原子级的$inc方法(数值增减),$rename方法(重命名字段名称)等等,

db.users.update({"_id" : ObjectId("51826852c75fdd1d8b805801")},  {"$set" : {"hobby" :["swimming","basketball"]}} )

db.users.update({"_id" : ObjectId("51826852c75fdd1d8b805801")},{"$unset" : {"hobby" :1 }} )

db.posts.update({"_id" : ObjectId("5180f1a991c22a72028238e4")}, {"$inc":{"pageviews":1}})

db.students.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } 

upsert是一律栽特有之换代操作,不是一个操作符。(upsert = up[date]+[in]sert),也就是是只要是则更新,否则就是描写副一漫长新的记录操作。这个参数是只布尔品种,默认是false。

db.users.update({age :25}, {$inc :{"age" :3}}, true)

另外,Update可以本着Json的聚众进行拍卖,如果对subject对象是一个凑合的话,插入或更新中的字段使用下的说话

db.student.update({name:'student5'},{$set:{subject:['music']}},{upsert:true});

若是记录已在,我们得以利用索引数值进行创新中集合里面的数据,如下所示。

db.student.update({name:'student3'},{$set:{'subject.0':'arts'}});

而我们事先以集聚里面加一个记录,而非替换的话,那么以$push语句,如下面的讲话所示。

db.student.update({name:'student3'},{$push:{'subject':'sports'}})

反,如果要移除集合里面的某部值,使用$pop*操作符,那么告诉句如下所示*

db.student.update({name:'student3'},{$pop:{'subject':1}});

其间索引为1标识最右面边的笔录,-1标识为无限左边的记录。

此外还可以采用$pushAll 和$pullAll来多/移除一个还是多只集聚记录,如下代码所示。

db.student.update({name:'student3'},{$pushAll:{'subject':['sports','craft']}})
db.student.update({name:'student3'},{$pullAll:{'subject':['sports','craft']}})

 

mongodb的数据库的操作还是于易于了解的,具体可进一步参考官网间的介绍。

https://docs.mongodb.org/manual/

https://docs.mongodb.org/getting-started/csharp/client/

http://mongodb.github.io/mongo-csharp-driver/2.2/

http://wiki.jikexueyuan.com/project/the-little-mongodb-book/

 

3、MongoDB数据库的C#俾之采取

 数据库的C#使得下介绍,可以参照:https://docs.mongodb.org/getting-started/csharp/,或者http://mongodb.github.io/mongo-csharp-driver/2.2/,可以下载相关的DLL然后在项目中引用,当前的驱动版本为2.2,一般引入下面几个DLL即可。

  • MongoDB.Bson.dll
  • MongoDB.Driver.dll
  • MongoDB.Driver.Core.dll

啊足以利用VS工具的NugGet包进行下载管理,如下所示。

图片 6

然后以弹出的NugGet程序包管理界面里找mongo,然后上加MongoDB.Driver的数据库让就足以用了。

图片 7

MongoDB数据库让在2.2本子(或者是从2.0开始)好像完全改写了API的接口,因此目前是版本同时支持少数单本子的API处理,一个是依据MongoDatabase的对象接口,一个凡是IMongoDatabase的对象接口,前者中规中矩,和咱们下Shell里面的下令名称差不多,后者IMongoDatabase的接口是根据异步的,基本上与前者差别十分怪,而且接口都提供了异步的处理操作。后面我会分别针对立即简单只有开展详尽的牵线,本文基于篇幅的来头,介绍一下两端的简易差异就足以了。

咱们坐Mongodb的数据库连接字符串mongodb://localhost/local来展开构建

1)旧接口MongoDatabase对象的构建

            var client = new MongoClient(connectionString);
            var database = client.GetServer().GetDatabase(new MongoUrl(connectionString).DatabaseName);

2)新接口IMongoDatabase对象的构建

            var client = new MongoClient(connectionString);
            var database = client.GetDatabase(new MongoUrl(connectionString).DatabaseName);

后任已经没了GetServer的接口了。

3)旧接口的检索对象处理

        /// <summary>
        /// 查询数据库,检查是否存在指定ID的对象
        /// </summary>
        /// <param name="key">对象的ID值</param>
        /// <returns>存在则返回指定的对象,否则返回Null</returns>
        public virtual T FindByID(string id)
        {
            ArgumentValidation.CheckForEmptyString(id, "传入的对象id为空");

            MongoCollection<T> collection = GetCollection();
            return collection.FindOneById(new ObjectId(id)); 
        }

3)新接口查找对象的拍卖

        /// <summary>
        /// 查询数据库,检查是否存在指定ID的对象
        /// </summary>
        /// <param name="key">对象的ID值</param>
        /// <returns>存在则返回指定的对象,否则返回Null</returns>
        public virtual T FindByID(string id)
        {
            ArgumentValidation.CheckForEmptyString(id, "传入的对象id为空");

            IMongoCollection<T> collection = GetCollection();
            return collection.Find(s=> s.Id == id).FirstOrDefault();
        }

新接口就没了FindOneById等接口了,所有的操作多还经过Find方法开展处理。旧接口很多经过Query对象进行标准的查询,新接口又转换了一个靶进行过滤条件处理了,总的来说,两只接口差异非常非常。

譬如旧本子接口的Query使用C#代码如下所示:

        private void TestQuery()
        {
            Query.All("name", new List<BsonValue> { BsonValue.Create("a"), BsonValue.Create("b") });//通过多个元素来匹配数组
            Query.And(Query.EQ("name", "a"), Query.EQ("title", "t"));//同时满足多个条件
            Query.Or(Query.EQ("name", "a"), Query.EQ("title", "t"));//满足其中一个条件
            Query.EQ("name", "a");//等于
            Query.Exists("type");//判断键值是否存在
            Query.GT("value", 2);//大于>
            Query.GTE("value", 3);//大于等于>=
            Query.In("name", new List<BsonValue> { BsonValue.Create("a"), BsonValue.Create("b") });//包括指定的所有值,可以指定不同类型的条件和值
            Query.LT("value", 9);//小于<
            Query.LTE("value", 8);//小于等于<=
            Query.Mod("value", 3, 1);//将查询值除以第一个给定值,若余数等于第二个给定值则返回该结果
            Query.NE("name", "c");//不等于
            Query.Size("name", 2);//给定键的长度
            Query.Type("_id", BsonType.ObjectId);//给定键的类型
            Query.ElemMatch("children", Query.And( Query.EQ("name", "C3"),   Query.EQ("value", "C")));

            //Query.Nor(Array);//不包括数组中的值
            //Query.Not("name");//元素条件语句
            //Query.NotIn("name", "a", 2);//返回与数组中所有条件都不匹配的文档
            //Query.Where(BsonJavaScript);//执行JavaScript

            //Query.Matches("Title", str);//模糊查询 相当于sql中like  -- str可包含正则表达式
            var keyword = "abc";
            Query.Matches("Title", new BsonRegularExpression("/.*" + keyword + ".*/"));//模糊Like语法

            //通过正则表达式 1开头 第二位数0~9且只能一位数,也包含20
            var queryName = Query.Matches("Name", new BsonRegularExpression("Donma1([0-9]{1,1})$|20"));
            //查找年龄 >=10 且<=20 
            var queryAge = Query.And(Query.GTE("Age", 10), Query.LTE("Age", 20));

            var entityQuery = Query<UserInfo>.EQ(e => e.Name, "wuhuacong");
            var entityQuery2 = Query<UserInfo>.EQ(e => e.Id, "4B414D000000011613CD");
        }

初本子的格查询,则抛了Query这个目标,提供了FilterDefinition<T>
对象的拍卖,估计是者得处理的重新好吧,同时新接口全部支撑异步的处理操作了。

要插入记录之异步操作代码如下所示。

        /// <summary>
        /// 插入指定对象到数据库中
        /// </summary>
        /// <param name="t">指定的对象</param>
        public virtual async Task InsertAsync(T t)
        {
            ArgumentValidation.CheckForNullReference(t, "传入的对象t为空");

            IMongoCollection<T> collection = GetCollection();
            await collection.InsertOneAsync(t);
        }

吓了,基于篇幅的缘故,把后面介绍的C#支出养至下一样篇进行介绍,希望本篇文章对大家了解mongodb数据库,以及哪些在C#面运用该数据库提供了一个粗略的引导,希望大家多支持。

 

网站地图xml地图