什么是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中的运用要领详解的细致内容,更多请关注ki4网别的相干文章!