>  기사  >  백엔드 개발  >  .Net에서 MongoDB를 사용하는 방법에 대한 튜토리얼

.Net에서 MongoDB를 사용하는 방법에 대한 튜토리얼

黄舟
黄舟원래의
2017-05-28 10:18:371956검색

최근 mongodb에 대해 연구하다가 인터넷에서 검색해 보니 .net에서 mongodb를 사용하는 것에 대한 글이 driver 초기 버전이거나 정보가 거의 없어서 에세이로 기록해 봤습니다. . 이 글은 .Net에서 MongoDB를 어떻게 사용하는지 튜토리얼이 필요한 친구들이 참고할 수 있도록 자세히 소개합니다.

MongoDB란

MongoDB는 테이블이 아닌 문서 저장소를 기반으로 하며, 비관계형 데이터베이스 중에서 가장 기능이 풍부하고 관계형인 제품입니다. . 지원하는 데이터 구조는 매우 느슨하고

json과 유사한 bson 형식이므로 더 복잡한 데이터 유형을 저장할 수 있습니다. Mongo의 가장 큰 특징은 지원하는 쿼리언어가 매우 강력하다는 것입니다. 구문은 객체 지향 쿼리 언어와 다소 유사하며 관계형 데이터베이스의 단일 테이블 쿼리와 유사한 대부분의 기능을 수행할 수 있습니다. 데이터 생성 인덱스 도 지원합니다. Mongo는 주로 대용량 데이터의 액세스 효율성 문제를 해결합니다. Mongo는 주로 대규모 데이터 저장소를 지원하기 때문에 Mongo에는 대규모 데이터 저장소를 지원할 수 있는 뛰어난 분산 파일 시스템 GridFS도 함께 제공됩니다. Mongo는 복잡한 데이터 구조를 지원할 수 있고 강력한 데이터 쿼리 기능을 가지고 있기 때문에 매우 인기가 있습니다. BSON은 MongoDB의 데이터 저장 형식입니다. JSON은 누구나 잘 알고 있지만 BSON은 JSON 형식을 기반으로 합니다. 변환을 위해 JSON을 선택하는 주된 이유는 JSON의 다양성과 스키마가 없는 특성 때문입니다.

BSON의 특징은 다음과 같습니다

1. 더 빠른 탐색 속도

JSON 형식의 경우 JSON 구조가 너무 크면 데이터 탐색이 매우 느려집니다. JSON에서는 데이터 읽기를 위해 문서를 건너뛰려면 문서를 스캔하고 대괄호 일치와 같은 번거로운 데이터 구조 일치를 수행해야 합니다. BSON이 JSON에 비해 크게 개선된 점은 각 요소의 길이가 저장된다는 점입니다. 요소의 헤더에 있으므로 요소의 길이만 읽으면 읽기 위해 지정된 지점을 직접 찾을 수 있습니다.

2. 더 쉬워진 작업

JSON의 경우 데이터 저장이 유형화되지 않습니다. 예를 들어 기본 값을 9에서 10으로 수정하려는 경우 한 문자에서 두 문자로 변경되므로 뒤에 All the가 올 수 있습니다. 콘텐츠를 한 위치 뒤로 이동해야 합니다. BSON을 사용하면 이 열을 숫자 열로 지정할 수 있습니다. 그런 다음 숫자가 9에서 10 또는 100으로 늘어나더라도 숫자가 저장된 비트만 수정하므로 데이터의 전체 길이가 변경되지 않습니다. 더 커지다. 물론 MongoDB에서는 숫자가 정수에서 긴 정수로 증가하면 전체 데이터 길이는 계속 늘어납니다.

3. 추가 데이터 유형이 추가되었습니다

  JSON은 매우 편리한 데이터 교환 형식이지만 그 유형이 상대적으로 제한되어 있습니다. BSON은 기본적으로 "byte

array

" 데이터 유형을 추가합니다. 이렇게 하면 바이너리 데이터를 JSON에 저장하기 전에 base64로 변환할 필요가 없습니다. 계산 오버헤드와 데이터 크기가 크게 줄어듭니다. 물론 때로는 유형 개념으로 인해 BSON이 JSON에 비해 공간 이점이 없는 경우도 있습니다.

Windows 아래의 MongoDB Installation MongoDB 설치는 매우 간단합니다. 설치가 완료될 때까지

Next

를 유지하세요. 아래에서 MongoDB 설치에 대해 자세히 설명합니다. 1. 데이터베이스

경로(데이터 디렉터리), 로그 경로(logs 디렉터리), 로그 파일(mongo.log 파일), 구성 경로(conf 디렉터리)를 만듭니다. 내 설치 경로는 D:Program

Filesmongodb2. conf 디렉터리에 configuration 파일

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(&#39;,&#39;);

   for (var i = 0; i < sortList.Length; i++)

   {

    var sl = Regex.Replace(sortList[i].Trim(), @"\s+", " ").Split(&#39; &#39;);

    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를 사용하는 방법에 대한 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.