全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

什么是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://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的最基本使用,后续会介绍副本级,主从自动备份等机制与实现方式,感兴趣的朋友们请继续关注,谢谢大家对的支持。


# .net  # mongodb  # asp.net  # demo  # .NET连接MongoDB数据库实例教程  # ASP.NET MVC4使用MongoDB制作相册管理  # MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查  # 就可以  # 数据结构  # 的是  # 数据存储  # 是一个  # 多条  # 多个  # 遍历  # 文档  # 会将  # 符合条件  # 变大  # 主要是  # 都是  # 查询功能  # 增加了  # 是在  # 是他  # 你可以  # 就能 


相关文章: 如何配置FTP站点权限与安全设置?  利用JavaScript实现拖拽改变元素大小  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  ,怎么用自己头像做动态表情包?  深圳网站制作案例,网页的相关名词有哪些?  建站VPS能否同时实现高效与安全翻墙?  如何在局域网内绑定自建网站域名?  网站制作需要会哪些技术,建立一个网站要花费多少?  建设网站制作价格,怎样建立自己的公司网站?  Swift中循环语句中的转移语句 break 和 continue  网站制作的步骤包括,正确网址格式怎么写?  油猴 教程,油猴搜脚本为什么会网页无法显示?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  建站org新手必看:2024最新搭建流程与模板选择技巧  网站设计制作公司地址,网站建设比较好的公司都有哪些?  建站168自助建站系统:快速模板定制与SEO优化指南  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站为何优先选择香港服务器?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  实现虚拟支付需哪些建站技术支撑?  如何在西部数码注册域名并快速搭建网站?  宝塔Windows建站如何避免显示默认IIS页面?  想学网站制作怎么学,建立一个网站要花费多少?  如何彻底卸载建站之星软件?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  宝塔建站教程:一键部署配置流程与SEO优化实战指南  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  公司网站制作价格怎么算,公司办个官网需要多少钱?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  javascript中对象的定义、使用以及对象和原型链操作小结  如何用PHP快速搭建高效网站?分步指南  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  音乐网站服务器如何优化API响应速度?  如何用PHP快速搭建CMS系统?  外贸公司网站制作哪家好,maersk船公司官网?  如何配置支付宝与微信支付功能?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  微信推文制作网站有哪些,怎么做微信推文,急?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何快速查询网站的真实建站时间?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  C++中引用和指针有什么区别?(代码说明)  建站之星如何开启自定义404页面避免用户流失?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  高端云建站费用究竟需要多少预算?  建站之星如何实现PC+手机+微信网站五合一建站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  活动邀请函制作网站有哪些,活动邀请函文案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。