.NetCore操作MongDB简要代码实现
.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简要代码实现的更多相关文章
- SELECT控件操作的JS代码示例
SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...
- C#开发中使用Npoi操作excel实例代码
C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Exce ...
- 30个php操作redis常用方法代码例子
From: http://www.jb51.net/article/51884.htm 这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型. ...
- php foreach 操作数组的代码
php foreach 操作数组的代码. foreach()有两种用法: foreach(array_name as $value) { statement; } 这里的array_na ...
- 30 个 php 操作 redis 常用方法代码例子
这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型. list 类型和 set 类型的数据 , 需要的朋友可以参 ...
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...
- Installshield停止操作系统进程的代码--IS5版本适用
原文:Installshield停止操作系统进程的代码--IS5版本适用 出处:http://www.installsite.org/pages/en/isp_ext.htm这个地址上有不少好东西,有 ...
- Installshield停止操作系统进程的代码 --IS6及以上版本适用
原文:Installshield停止操作系统进程的代码 --IS6及以上版本适用 setup.rul的代码 Code;end;///////////////////////////////////// ...
- C# FTP操作类的代码
如下代码是关于C# FTP操作类的代码.using System;using System.Collections.Generic;using System.Text;using System.Net ...
随机推荐
- list_for_eacy_entry图解
.
- 神奇的字符串匹配:扩展KMP算法
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...
- 062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用 本文知识点:二维数组应用 二维数组的声明和创建 ? 出现空指针异常 数组的名字指向数组的第 ...
- 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...
- python在一个画布上画多个子图
转载:https://blog.csdn.net/qq_26449287/article/details/103022636 matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使 ...
- 【题解】CF1290B Irreducible Anagrams
Link 题目大意:对于一个字符串,每次询问一个区间,看看这个区间是不是可以划分为若干区间,这些区间内数字经过排列后可以还原原来区间. \(\text{Solution:}\) 菜鸡笔者字符串构造该好 ...
- Morris遍历
Morris遍历 一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1) 通过利用原树中大量空闲指针的方式,达到节省空间的目的 Morris遍历可以改前中后序的树遍历 思路: 创建一个当 ...
- 实时,异步网页使用jTable, SignalR和ASP。NET MVC
下载source code - 984.21 KB 图:不同客户端的实时同步表. 点击这里观看现场演示. 文章概述 介绍使用的工具演示实现 模型视图控制器 遗言和感谢参考历史 介绍 HTTP(即web ...
- 视频+图文教程 | Java之安装JDK与环境配置
演示所用软件JDK 8与Eclipse(Java开发工具)软件下载链接: 链接:https://pan.baidu.com/s/1Vg9ulrQH8WlGRAE89Y02UA提取码:swwl 视频介绍 ...
- Prometheus第一篇:Prometheus架构解析
Prometheus是新一代的监控系统解决方案,原生支持云环境,和kubernetes无缝对接,的却是容器化监控解决方案的不二之选.当然对传统的监控方案也能够兼容,通过自定义或是用开源社区提供的各种e ...