.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 ...
随机推荐
- 山寨一个Spring的@Component注解
1. 前言 我们在上一篇对Mybatis如何将Mapper接口注入Spring IoC进行了分析,有同学问胖哥这个有什么用,这个作用其实挺大的,比如让你实现一个类似@Controller的注解(或者继 ...
- 井字棋小游戏(C语言)
最近沉迷于<NetHack>.<DCSS>等字符游戏,对其很感兴趣,于是用C语言写了个字符界面的井字棋小游戏.欢迎大家指教. 编写时遇到了一些问题,我原先准备用循环,直到读取到 ...
- python数据结构树和二叉树简介
一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否 ...
- 温故知新----封装(struct)
上次提到class是最常见的封装,今天发现别人开发的SDK里面有大量的结构体struct 转载: 1. https://blog.csdn.net/a_forever_dream/article/de ...
- 日常使用 ADB 命令
最近项目中经常与安卓设备相连,用到adb命令.整理一下常用命令. wifi控制命令 adb connect IP 若连接失败,可尝试插数据线运行以下两条命令后,方可拔掉数据线,在设备未关闭之前可以直接 ...
- JWT安全性第1部分,创建令牌
下载Demo Core 2.0 - 13.2 MB 下载Demo Core 1.2 - 14 MB 介绍 JWT (JSON Web Token)作为保护Web站点和REST服务的标准越来越流行.我将 ...
- RHSA-2017:2930-重要: 内核 安全和BUG修复更新(需要重启、存在EXP、本地提权、代码执行)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- X86保护机制
目录 保护机制的开启与关闭 描述符表限长检查 段限长检查 段类型检查 类型信息的存储 类型检查 空选择子的检查 特权级检查 访问数据段时的特权级检查 访问代码段中的数据 堆栈寄存器SS的特权级检查 在 ...
- 多测师讲解自动化--rf关键字--断言(下)_高级讲师肖sir
断言: 1.1Page Should Contain Maximize Browser Window sleep 2 Comment Page Should Contain hao123 #断言当前页 ...
- 多测师讲解 自动化测试理论(1)_高级讲师肖sir
自动化测试理论什么是自动化测试?广义的:通过工具或程序替代或辅助人工测试的行为叫自动化测试狭义的:通过工具录制或编写脚本模拟手工测试的过程,通过回放或运行脚本执行测试用例,从而代替人工对系统的功能验证 ...