当前位置: 移动技术网 > IT编程>开发语言>.net > 在.Net中使用MongoDB的方法教程

在.Net中使用MongoDB的方法教程

2017年12月08日  | 移动技术网IT编程  | 我要评论

独身主义者,聂洪生,女教师升迁笔记

什么是mongodb

mongodb是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。mongo主要解决的是海量数据的访问效率问题。因为mongo主要是支持海量数据存储的,所以mongo还自带了一个出色的分布式文件系统gridfs,可以支持海量的数据存储。由于mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎。

bson是mongodb的数据存储格式。大家对于json比较熟悉,但是什么是bson呢bson基于json格式,选择json进行改造的原因主要是json的通用性及json的schemaless的特性。

bson具有如下特点

1.更快的遍历速度

  对json格式来说,太大的json结构会导致数据遍历非常慢。在json中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦数据结构匹配,比如括号的匹配,而bson对json的一大改进就是,它会将json的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。

2.操作更简易

  对json来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用bson,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在mongodb中,如果数字从整形增大到长整型,还是会导致数据总长变大的。

3.增加了额外的数据类型

  json是一个很方便的数据交换格式,但是其类型比较有限。bson在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成json。大大减少了计算开销和数据大小。当然,在有的时候,bson相对json来说也并没有空间上的优势,因为有了类型概念。

mongodb windows下 安装

mongodb的安装很简单,设置好安装路径后,一直next直到安装结束,最大的坑就是mongodb服务的安装,下面具体说下mongodb安装之后的一些配置操作

1.在根目录下创建数据库路径(data目录)、日志路径(logs目录)、日志文件(mongo.log文件)、配置路径(conf目录)我的安装路径是:d:\program files\mongodb

2.在conf目录下创建配置文件mongo.conf,文件内容如下:

logpath=d:\program files\mongodb\logs\mongodb.log #日志输出文件路径

logappend=true #错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件

journal=true #启用日志文件,默认启用

quiet=true #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false

port=27017 #端口号 默认为27017

auth=true #启用验证 需要用户名密码 

配置完成以上2个步骤 就可以 启动mongodb了

运行cmd 输入命令 (注意 mongod的路径)

mongod --config " d:\program files\mongodb\data \conf\mongo.conf"

3.创建并启动mongodb服务

如果每次都按照步骤三那样操作,岂不是相当麻烦,按照如下命令来创建并启动mongodb服务,就可以通过windows服务来管理mongodb的启动和关闭了

mongod --config " d:\program files\mongodb\data \conf\mongo.conf" --install --servicename "mongodb"

net start mongodb 

测试是否成功 可以在 浏览器中输入http://www.lhsxpumps.com/_localhost:27017/如果出现下图表示服务安装成功

如果需要卸载mongodb服务 在cmd 中运行

mongod.exe --remove --servicename "mongodb"

前期准备工作完成了,就可以开始撸代码了

如何在.net 中使用mongodb

首先在项目中引入 mongodb.bson.dll,mongodb.driver.dll,mongodb.driver.core.dll 我使用的是2.0版本的 现在好多文章都是介绍使用1+版本的 这也是我写此文的目的引入驱动dll后,就可以开始撸代码了

部分代码如下

private static mongoclient client;

private static imongodatabase database;

//本地配置

private const string mongodbconnectionstr = "mongodb://localhost";

//数据库名称

private static string defaultdatabasename = "test";

 

 

public mongodbhelper()

{

 getconnection(defaultdatabasename);

}

 

/// <summary>

/// 构造函数 指定数据库

/// </summary>

/// <param name="databasename"></param>

public mongodbhelper(string databasename)

{

 getconnection(databasename);

}

 

private static void getconnection(string databasename)

{

 client = new mongoclient(mongodbconnectionstr);

 database = client.getdatabase(databasename);

}

 

/// <summary>

/// 异步插入一条数据,手动输入collection name

/// </summary>

public task insertasync<t>(string collectionname, t obj)

{

 if (database == null)

 {

  throw new exception("没有指定数据库");

 }

 var collection = database.getcollection<t>(collectionname);

 return collection.insertoneasync(obj);

}

 

/// <summary>

/// 异步插入一条数据,采用类型t的完全限定名作为collection name

/// </summary>

public task insertasync<t>(t obj)

{

 return insertasync(typeof(t).fullname, obj);

}

 

/// <summary>

/// 异步插入多条数据,手动输入collection name

/// </summary>

public task batchinsertasync<t>(string collectionname, ienumerable<t> objs)

{

 if (database == null)

 {

  throw new exception("没有指定数据库");

 }

 if (objs == null)

 {

  throw new argumentexception();

 }

 var collection = database.getcollection<t>(collectionname);

 return collection.insertmanyasync(objs);

}

 

/// <summary>

/// 异步插入多条数据,采用类型t的完全限定名作为collection name

/// </summary>

public task batchinsertasync<t>(ienumerable<t> objs)

{

 return batchinsertasync(typeof(t).fullname, objs);

}

 

/// <summary>

/// 插入一条数据

/// </summary>

public void insert<t>(t obj)

{

 insertasync(obj).wait();

}

 

/// <summary>

/// 插入多条数据

/// </summary>

public void insert<t>(ienumerable<t> objs)

{

 batchinsertasync(objs).wait();

}

 

/// <summary>

/// mongodb c# driver的find方法,返回ifindfluent。手动输入collection name

/// </summary>

public ifindfluent<t, t> find<t>(string collectionname, filterdefinition<t> filter, findoptions options = null)

{

 if (database == null)

 {

  throw new exception("没有指定数据库");

 }

 var collection = database.getcollection<t>(collectionname);

 return collection.find(filter, options);

}

 

/// <summary>

/// mongodb c# driver的find方法,返回ifindfluent。采用类型t的完全限定名作为collection name

/// </summary>

public ifindfluent<t, t> find<t>(filterdefinition<t> filter, findoptions options = null)

{

 return find(typeof(t).fullname, filter, options);

}

 

/// <summary>

/// 取符合条件的数据 sort中多个排序条件逗号分隔,默认asc

/// </summary>

public list<t> get<t>(expression<func<t, bool>> condition, int skip, int limit, string sort)

{

 return get(new list<expression<func<t, bool>>> { condition }, skip, limit, sort);

}

 

public list<t> get<t>(expression<func<t, bool>> condition)

{

 return get(condition, 0, 0, null);

}

 

/// <summary>

/// 取符合条件的数据 sort中多个排序条件逗号分隔,默认asc

/// </summary>

public list<t> get<t>(list<expression<func<t, bool>>> conditions, int skip, int limit, string sort)

{

 if (conditions == null || conditions.count == 0)

 {

  conditions = new list<expression<func<t, bool>>> { x => true };

 }

 var builder = builders<t>.filter;

 var filter = builder.and(conditions.select(x => builder.where(x)));

 

 var ret = new list<t>();

 try

 {

  list<sortdefinition<t>> sortdeflist = new list<sortdefinition<t>>();

  if (sort != null)

  {

   var sortlist = sort.split(',');

   for (var i = 0; i < sortlist.length; i++)

   {

    var sl = regex.replace(sortlist[i].trim(), @"\s+", " ").split(' ');

    if (sl.length == 1 || (sl.length >= 2 && sl[1].tolower() == "asc"))

    {

     sortdeflist.add(builders<t>.sort.ascending(sl[0]));

    }

    else if (sl.length >= 2 && sl[1].tolower() == "desc")

    {

     sortdeflist.add(builders<t>.sort.descending(sl[0]));

    }

   }

  }

  var sortdef = builders<t>.sort.combine(sortdeflist);

  ret = find(filter).sort(sortdef).skip(skip).limit(limit).tolistasync().result;

 }

 catch (exception e)

 {

  //异常处理

 }

 return ret;

}

 

public list<t> get<t>(list<expression<func<t, bool>>> conditions)

{

 return get(conditions, 0, 0, null);

} 

示例代码中只实现了插入和查询功能,后续会将完整代码上传

总结

本文只记录了mongodb的最基本使用,后续会介绍副本级,主从自动备份等机制与实现方式,感兴趣的朋友们请继续关注移动技术网,谢谢大家对移动技术网的支持。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网