.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 ...
随机推荐
- nessus 家庭版安装教程(windows)
1.根据系统选择安装包:https://www.tenable.com/products/nessus/select-your-operating-system 2.申请激活码,在我们安装的时候差不多 ...
- JDK 中的栈竟然是这样实现的?
前面的文章<动图演示:手撸堆栈的两种实现方法!>我们用数组和链表来实现了自定义的栈结构,那在 JDK 中官方是如何实现栈的呢?接下来我们一起来看. 这正式开始之前,先给大家再解释一下「堆栈 ...
- JVM初步入门(很初级,建议只做大致了解用)
jvm初步入门 本博客中的所有内容都是来自b站狂神说视频教程,如有侵权联系我删除. 下面是视频链接:b站狂神说 关于jvm的几个小问题 1. jvm的位置: jvm是一个运行在操作系统上的用c语言编写 ...
- SHOI 2013 【扇形面积并】
早上考的,我打了80分的部分分,出来和同学讨论的时候真想扇自己一巴掌...... 题目描述: 给定 n 个同心的扇形,求有多少面积,被至少k 个扇形所覆盖. 输入输出格式 输入格式: 第一行是三个整数 ...
- 关于 ECMAScript、JavaScript、ES6、ECMAScript 2015
ECMAScript 是一种规范,而 JavaScript 是对规范的实现.ECMA 是标准化组织. 最早的 JavaScript 是由 Netscape 公司开发的,并提交给 ECMA 标准化组织, ...
- SpringBoot+单机redis
spring boot-redis集成 看教程来的,看起来很简单,但是集成后发现启动失败? WARN 2556 --- [ restartedMain] ationConfigEmbeddedWebA ...
- Java 集合看这一篇就够了
大家好,这里是<齐姐聊数据结构>系列之大集合. 话不多说,直接上图: Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的: Collection 和 Map ...
- 安装clion
转战c语言,首先搞定编辑器,之前用的pycharm所以就直接用clion了,但是装完不能直接用参考 https://www.cnblogs.com/lyc94620/p/9581786.html 所以 ...
- MeteoInfoLab脚本示例:FY-2C 云分类HDF数据
脚本程序: #Add data file fn = 'D:/Temp/hdf/FY2C_CLC_MLT_NOM_20070730_1800.hdf' f = addfile(fn) #Get data ...
- day14 Pyhton学习
一.迭代器-概念 可迭代协议:内部含有__iter__方法的值/变量都是可迭代的 如何得到一个迭代器:可迭代变量.__iter__()返回一个迭代器 迭代器协议:内部含有__iter__方法和__ne ...