.NetCore操作MongoDB简要代码实现

在接触过的大多数使用mongodb的情景中,基本上都是用mongodb来存储日志的。

mongodb是作为一种文档型的数据库,在管理日志文档上确实比较适合。直接使用文档存储日志,非常不利于日志的查看以及问题的排查统计,如果使用mysql或者mssql等关系型数据库去存储日志,那是非常浪费也是不必要的。

所以以下就简单的封装mongodb实现异常日志记录。

引入如下程序集

MongoDB.Driver
mongocsharpdriver

创建实体类

 1 public interface IBaseMongoEntity
2 {
3 ObjectId Id { get; set; }
4 }
5 public class BaseMongoEntity : IBaseMongoEntity
6 {
7 public BaseMongoEntity()
8 {
9 Id = ObjectId.GenerateNewId();
10 }
11 /// <summary>
12 /// Id
13 /// </summary>
14 public ObjectId Id { get; set; }
15 }

基类

 1  /// <summary>
2 /// 异常日志
3 /// </summary>
4 public class ExceptionLog : BaseMongoEntity
5 {
6 /// <summary>
7 /// 异常时间
8 /// </summary>
9 public DateTime ExTime { get; set; }
10 /// <summary>
11 /// 消息
12 /// </summary>
13 public string Message { get; set; }
14 /// <summary>
15 /// 详细信息
16 /// </summary>
17 public string Detail { get; set; }
18 /// <summary>
19 ///
20 /// </summary>
21 public string IpAddress { get; set; }
22 /// <summary>
23 /// 操作
24 /// </summary>
25 public string Action { get; set; }
26 /// <summary>
27 /// 等级
28 /// </summary>
29 public int Level { get; set; }
30 /// <summary>
31 /// 请求内容
32 /// </summary>
33 public string RequestContent{get;set;}
34 }

异常实体类

实现仓储类

 1  public interface IBaseMongoRepository<T> where T : BaseMongoEntity
2 {
3 /// <summary>
4 /// 添加一个数据
5 /// </summary>
6 /// <param name="data">添加的数据</param>
7 /// <returns></returns>
8 Task InsertAsync(T data);
9 /// <summary>
10 /// 删除数据
11 /// </summary>
12 /// <param name="id">Guid</param>
13
14 Task<DeleteResult> DeleteAsync(ObjectId id);
15 /// <summary>
16 /// 修改
17 /// </summary>
18 /// <param name="data"></param>
19 /// <returns></returns>
20 Task UpdateAsync(T data);
21 /// <summary>
22 /// 获取所有数据
23 /// </summary>
24 /// <returns></returns>
25 Task<IEnumerable<T>> FindAllAsync();
26 /// <summary>
27 /// 根据Id获取一条数据
28 /// </summary>
29 /// <param name="id">数据Guid</param>
30 /// <returns></returns>
31 Task<T> FindByIdAsync(ObjectId id);
32
33 }

仓储接口

  1     public class BaseMongoRepository<T> : IBaseMongoRepository<T> where T : BaseMongoEntity
2 {
3 private object mLog = new object();
4 /// <summary>
5 /// mongo client
6 /// </summary>
7 protected IMongoClient Client;
8 /// <summary>
9 /// 数据库
10 /// </summary>
11 protected IMongoDatabase Database;
12 /// <summary>
13 /// 文档
14 /// </summary>
15 protected IMongoCollection<T> Collection;
16
17 /// <summary>
18 /// 构成函数
19 /// </summary>
20 /// <param name="dbSettings">数据库连接字符串</param>
21 public BaseMongoRepository(IOptions<MongoDbSettting> dbSettings)
22 {
23 Client = new MongoClient(dbSettings.Value.ConnectionString);
24 Database = Client.GetDatabase(dbSettings.Value.DatabaseName);
25
26 Collection = GetCollection();
27 }
28
29 /// <summary>
30 ///
31 /// </summary>
32 private IMongoCollection<T> GetCollection()
33 {
34 var collectionNameList = Database.ListCollections().ToList().Select(p => p["name"]).ToList();
35
36 string collectionName = GetCollectionName(typeof(T));
37 if (!collectionNameList.Contains(collectionName))
38 {
39 lock (this.mLog)
40 {
41 SetBsonClassMap();
42 Database.CreateCollection(collectionName);
43 }
44 }
45 return Database.GetCollection<T>(collectionName);
46
47 }
48 /// <summary>
49 /// 文档字段映射
50 /// </summary>
51 private void SetBsonClassMap()
52 {
53 BsonClassMap.RegisterClassMap((BsonClassMap<T> t) =>
54 {
55 t.AutoMap();
56 // t.MapIdProperty("Id");
57 // t.MapIdMember(x => x.Id).SetIdGenerator(ObjectIdGenerator.Instance); // 使用objectId作为文档id
58 });
59 }
60 private string GetCollectionName(Type t)
61 {
62 var attr = Attribute.GetCustomAttribute(t, typeof(MongoCollectionAttribute)) as MongoCollectionAttribute;
63 if (attr != null)
64 {
65 return attr.Name;
66 }
67 else
68 {
69 return t.Name;
70 }
71 }
72 /// <summary>
73 /// 添加
74 /// </summary>
75 /// <param name="data"></param>
76 /// <returns></returns>
77 public async Task InsertAsync(T data)
78 {
79 await Collection.InsertOneAsync(data);
80 }
81 /// <summary>
82 /// 删除
83 /// </summary>
84 /// <param name="id"></param>
85 /// <returns></returns>
86 public async Task<DeleteResult> DeleteAsync(ObjectId id)
87 {
88 return await Collection.DeleteOneAsync(p => p.Id == id);
89 }
90
91 /// <summary>
92 /// 更新
93 /// </summary>
94 /// <param name="data"></param>
95 /// <returns></returns>
96 public async Task UpdateAsync(T data)
97 {
98 var filter = Builders<T>.Filter.Eq("id", data.Id);
99 BsonDocument doc = BsonExtensionMethods.ToBsonDocument(data);
100 var update = new UpdateDocument(doc);
101 await Collection.UpdateOneAsync(filter, update);
102 }
103 /// <summary>
104 /// 查询所有
105 /// </summary>
106 /// <returns></returns>
107 public async Task<IEnumerable<T>> FindAllAsync()
108 {
109 return await Collection.Find(p => true).ToListAsync();
110 }
111 /// <summary>
112 /// 根据Id查找
113 /// </summary>
114 /// <param name="id"></param>
115 /// <returns></returns>
116 public async Task<T> FindByIdAsync(ObjectId id)
117 {
118 return await Collection.Find(p => p.Id == id).FirstOrDefaultAsync();
119 }
120 }

仓储基类

1  public class ExceptionLogRepository:BaseMongoRepository<ExceptionLog>
2 {
3 public ExceptionLogRepository(IOptions<MongoDbSettting> dBSettings)
4 :base(dBSettings)
5 {
6
7 }
8 }

异常日志操作类

 public class MongoDbSettting : IOptions<MongoDbSettting>
{
public string ConnectionString { get; set; }
public string DatabaseName { get; set; } public MongoDbSettting Value => this;
}

mongodb settting

简单测试使用

在配置文件中配置mongodb连接信息

1 {
2 "MongoDbConnection": {
3 "ConnectionString": "mongodb://qingy:123456890@localhost/testdb",
4 "DatabaseName": "testdb"
5 }
6 }

配置mongo连接

单元测试代码

 1     public class MongoDbTest
2 {
3 IServiceProvider serviceProvider = null;
4
5 public MongoDbTest()
6 {
7 IServiceCollection services = new ServiceCollection();
8 #region config
9 var builder = new ConfigurationBuilder()
10 .SetBasePath(Directory.GetCurrentDirectory())
11 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
12
13
14 IConfigurationRoot configuration = builder.Build();
15 services.AddSingleton<IConfiguration>(configuration); //添加配置到服务中
16 #endregion
17 #region 依赖注入
18
19 services.Configure<MongoDbSettting>(options =>
20 {
21 options.ConnectionString = configuration.GetSection("MongoDbConnection:ConnectionString").Value;
22 options.DatabaseName = configuration.GetSection("MongoDbConnection:DatabaseName").Value;
23 });
24 // 注入数据库操作
25 services.AddTransient<IBaseMongoRepository<ExceptionLog>, ExceptionLogRepository>();
26
27 // services.AddTransient<Ixxx, xxxx>();
28 //构建容器
29 serviceProvider = services.BuildServiceProvider();
30 #endregion
31 }
32
33 [Fact]
34 public void Test() {
35 var ss= serviceProvider.GetService(typeof(IBaseMongoRepository<ExceptionLog>)) as IBaseMongoRepository<ExceptionLog>;
36 if (ss != null)
37 {
38 var log = new ExceptionLog()
39 {
40
41 Action = "init",
42 Detail = "init testing",
43 ExTime = DateTime.Now,
44 IpAddress = "127.0.0.1",
45 Level = 1,
46 Message = "test",
47 RequestContent = "home",
48 };
49 ss.InsertAsync(log);
50 }
51 Assert.True(1 == 1);
52 }
53
54 }

单元测试代码

  

.NetCore操作MongDB简要代码实现的更多相关文章

  1. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  2. C#开发中使用Npoi操作excel实例代码

    C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...

  3. 30个php操作redis常用方法代码例子

    From: http://www.jb51.net/article/51884.htm 这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型. ...

  4. php foreach 操作数组的代码

    php foreach 操作数组的代码.   foreach()有两种用法:  foreach(array_name as $value)  {  statement;  }  这里的array_na ...

  5. 30 个 php 操作 redis 常用方法代码例子

    这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型. list 类型和 set 类型的数据 , 需要的朋友可以参 ...

  6. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  7. Installshield停止操作系统进程的代码--IS5版本适用

    原文:Installshield停止操作系统进程的代码--IS5版本适用 出处:http://www.installsite.org/pages/en/isp_ext.htm这个地址上有不少好东西,有 ...

  8. Installshield停止操作系统进程的代码 --IS6及以上版本适用

    原文:Installshield停止操作系统进程的代码 --IS6及以上版本适用 setup.rul的代码 Code;end;///////////////////////////////////// ...

  9. C# FTP操作类的代码

    如下代码是关于C# FTP操作类的代码.using System;using System.Collections.Generic;using System.Text;using System.Net ...

随机推荐

  1. Clover 引导 Windows 及 Linux 双系统

    Clover 引导 Windows 及 Linux 双系统UEFI cnblogs @ Orcim  此 文比较详细地介绍了通过修改 Clover 的配置文件,添加 Clover 启动项的方法(添加 ...

  2. 035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构

    035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构 本文知识点:Java中的多重if结构 选择结构回顾 if选择结构 注意: 1.条 ...

  3. 【Go语言入门系列】Go语言工作目录介绍及命令工具的使用

    [Go语言入门系列]前面的文章: [保姆级教程]手把手教你进行Go语言环境安装及相关VSCode配置 [Go语言入门系列](八)Go语言是不是面向对象语言? [Go语言入门系列](九)写这些就是为了搞 ...

  4. Github 太狠了,居然把 "master" 干掉了!

    前段时间栈长有看到 Github 和 master 分支变更的新闻,当时没有注意细节,直到今天我创建仓库时: 看了半天感觉有点不对劲啊... 怎么 master 不见了,之前默认主干分支名称都是叫 m ...

  5. TP5本地运行正常,线上运行某页面出现【模板文件不存在】问题的解决办法

    相信许多小伙伴和我一样,明明在本地运行页面一切正常,而到线上(本人是用的虚拟主机)出现了如下图的问题: 其实这个问题出现的原因很简单,就是我们开发是在windows 系统下,windows系统对大小写 ...

  6. CN1,CN2 GT和CN2 GIA的区别

    用一句话来概括,CN1主要定位于承载普通质量的互联网业务,而CN2则定位于承载企业VPN业务.中国电信的自营业务及高质量的互联网业务,CN2 GIA又比GT要好一些. 顺序:CN2 GIA>CN ...

  7. JavaCV FFmpeg H264编码

    上次成功通过FFmpeg采集摄像头的YUV数据,这次针对上一次的程序进行了改造,使用H264编码采集后的数据. (传送门) JavaCV FFmpeg采集摄像头YUV数据 采集摄像头数据是一个解码过程 ...

  8. devops-jenkins-Pipeline实战

    1) 配置gitlab的分支项目 点击红色标记的创建 project 项目 点击Create project创建Pipeline-demo项目 项目创建完成,然后我们创建一个Add README 然后 ...

  9. docker-管理镜像常用命令

    1. docker管理镜像常用命令 指令 说明 docker   run     [容器 CONTAINER ID] 创建一个新的容器并运行一个命令 docker   start   [容器 CONT ...

  10. 题解:洛谷P1357 花园

    题解:洛谷P1357 花园 Description 小 L 有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为 \(1∼n\).花园 \(1\) 和 \(n\) 是相邻的. 他的环形花园每天都会换 ...