.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 ...
随机推荐
- C#编写一个较完整的记事本程序
开发环境 Visual Studio 2019 至少需安装 .NET桌面开发 创建项目并配置 创建窗体文件 配置项目名称及框架 设计界面 创建窗体文件,将控件摆放位置如下,参考系统自带的记事本程序 窗 ...
- 给select赋值的一种方法
做毕设遇到的问题,在update数据的时候,要先把原来的数据传递给前台,赋值给input等标签,但是啊,select标签没有value属性啊,所以在这里研究了一下,总结一个给select赋值的方法吧 ...
- c++中 预编译头文件PCH
转载:https://blog.csdn.net/lovemysea/article/details/74858430 一.预编译头文件使用经验: 如果预编译头文件被正确使用时,它确实大大提高我们编程 ...
- Matlab中num2str函数的用法
转载:https://blog.csdn.net/SMF0504/article/details/51836062 函数功能: 把数值转换成字符串, 转换后可以使用fprintf或disp函数进行输出 ...
- Visual Studio中Debug与Release以及x86、x64、Any CPU的区别 &&&& VS中Debug与Release、_WIN32与_WIN64的区别
本以为这些无关紧要的 Debug与Release以及x86.x64.Any CPU 差点搞死人了. 看了以下博文才后怕,难怪我切换了一下模式,程序就pass了.... 转载: 1.https://ww ...
- spring-boot-route(十)多数据源切换
前面我们已经介绍了三种方式来操作数据库,在实际开发中,往往会出现一个服务连接多个数据库的需求,这时候就需要在项目中进行灵活切换数据源来完成多个数据库操作.这一章中,我们使用jdbcTemplate来学 ...
- randomatic
下载 randomaticrandomatic 使用简单的字符序列生成指定长度的随机字符串.原generate-password. 请考虑下面这个项目的作者,Jon Schlinkert主演的,考虑项 ...
- 记录小坑-tp5 使用模型select查询
场景: 使用模型去select查询后进行业务处理 再进行 saveAll 提示缺少更新条件 坑点:此时取出的数据结构是 query对象 { array:[ xxxx => xxx ] }: sa ...
- Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)
本篇博文是Oracle和MySQL之间的等效SQL转换和不同,目前市面上没有转换两种SQL的工具,小编觉得以后也不一定会有,于是在业余时间整理了一下,如果有什么错误之处请留言告知,小编也是刚入门的小白 ...
- 扫描仪扫描文件处理-A4分辨率
转换公式:毫米转英寸,英寸乘以DPI(每英寸点数) 1英寸 = 2.54 厘米 = 25.4 毫米 例子(600dpi):mm: 210x297 = px: 4961(210/25.4*600)x70 ...