Asp.Net Core MongoDB
废话不说直接上代码;
using MongoDB.Bson.Serialization.Attributes; namespace XL.Core.MongoDB
{
public interface IEntity<TKey>
{
/// <summary>
/// 主键
/// </summary>
[BsonId]
TKey Id { get; set; }
}
}
[BsonIgnoreExtraElements(Inherited = true)]
public abstract class Entity : IEntity<string>
{
/// <summary>
/// 主键
/// </summary>
[BsonRepresentation(BsonType.ObjectId)]
public virtual string Id { get; set; } }
public interface IRepository<T, in TKey> : IQueryable<T> where T : IEntity<TKey>
{
#region Fileds /// <summary>
/// MongoDB表
/// </summary>
IMongoCollection<T> DbSet { get; } /// <summary>
/// MongoDB库
/// </summary>
IMongoDatabase DbContext { get; } #endregion #region Find /// <summary>
/// 根据主键获取对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
T GetById(TKey id); /// <summary>
/// 获取对象
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
IEnumerable<T> Get(Expression<Func<T, bool>> predicate); /// <summary>
/// 获取对象
/// </summary>
/// <param name="predicate"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default(CancellationToken)); #endregion #region Insert /// <summary>
/// 插入文档
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
T Insert(T entity); /// <summary>
/// 异步插入文档
/// </summary>
/// <param name="entity"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task InsertAsync(T entity, CancellationToken cancellationToken = default(CancellationToken)); /// <summary>
/// Adds the new entities in the repository.
/// </summary>
/// <param name="entities">The entities of type T.</param>
void Insert(IEnumerable<T> entities); /// <summary>
/// 插入文档
/// </summary>
/// <param name="entities"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task InsertAsync(IEnumerable<T> entities, CancellationToken cancellationToken = default(CancellationToken)); #endregion #region Update /// <summary>
/// 更新文档
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
UpdateResult Update(T entity); /// <summary>
/// 异步更新文档
/// </summary>
/// <param name="entity"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<UpdateResult> UpdateAsync(T entity, CancellationToken cancellationToken = default(CancellationToken)); #endregion #region Delete /// <summary>
/// 根据主键ID
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
T Delete(TKey id); /// <summary>
/// 异步根据ID删除文档
/// </summary>
/// <param name="id"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<T> DeleteAsync(TKey id, CancellationToken cancellationToken = default(CancellationToken)); /// <summary>
/// 异步删除
/// </summary>
/// <param name="predicate"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<DeleteResult> DeleteAsync(Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = default(CancellationToken)); /// <summary>
/// 删除
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
DeleteResult Delete(Expression<Func<T, bool>> predicate); #endregion #region Other /// <summary>
/// 计数
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
long Count(Expression<Func<T, bool>> predicate); /// <summary>
/// 计数
/// </summary>
/// <param name="predicate"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<long> CountAsync(Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = new CancellationToken()); /// <summary>
/// 是否存在
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
bool Exists(Expression<Func<T, bool>> predicate); #endregion #region Query
/// <summary>
/// 分页
/// 注:只适合单属性排序
/// </summary>
/// <param name="predicate"></param>
/// <param name="sortBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <returns></returns>
IEnumerable<T> Paged(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,
int pageSize, int pageIndex = );
/// <summary>
///
/// </summary>
/// <param name="predicate"></param>
/// <param name="sortBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<T>> PagedAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,
int pageSize, int pageIndex = ,
CancellationToken cancellationToken = new CancellationToken()); #endregion
} public interface IRepository<T> : IRepository<T, string>
where T : IEntity<string>
{
}
public class MongoRepository<T> : IRepository<T> where T : IEntity<string>
{
#region Constructor protected MongoRepository(IMongoCollection<T> collection)
{
DbSet = collection;
DbContext = collection.Database;
} #endregion public IEnumerator<T> GetEnumerator()
{
return DbSet.AsQueryable().GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
} #region 字段 public Type ElementType => DbSet.AsQueryable().ElementType;
public Expression Expression => DbSet.AsQueryable().Expression;
public IQueryProvider Provider => DbSet.AsQueryable().Provider;
public IMongoCollection<T> DbSet { get; }
public IMongoDatabase DbContext { get; } #endregion #region Find public T GetById(string id)
{
return Get(a => a.Id.Equals(id)).FirstOrDefault();
} public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
return DbSet.FindSync(predicate).Current;
} public async Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = new CancellationToken())
{
var task = await DbSet.FindAsync(predicate, null, cancellationToken);
return task.Current;
} #endregion #region Insert public T Insert(T entity)
{
DbSet.InsertOne(entity);
return entity;
} public Task InsertAsync(T entity, CancellationToken cancellationToken = new CancellationToken())
{
return DbSet.InsertOneAsync(entity, null, cancellationToken);
} public void Insert(IEnumerable<T> entities)
{
DbSet.InsertMany(entities);
} public Task InsertAsync(IEnumerable<T> entities, CancellationToken cancellationToken = new CancellationToken())
{
return DbSet.InsertManyAsync(entities, null, cancellationToken);
} #endregion #region Update public UpdateResult Update(T entity)
{
var doc = entity.ToBsonDocument();
return DbSet.UpdateOne(Builders<T>.Filter.Eq(e => e.Id, entity.Id),
new BsonDocumentUpdateDefinition<T>(doc));
} public Task<UpdateResult> UpdateAsync(T entity, CancellationToken cancellationToken = new CancellationToken())
{
var doc = entity.ToBsonDocument();
return DbSet.UpdateOneAsync(Builders<T>.Filter.Eq(e => e.Id, entity.Id),
new BsonDocumentUpdateDefinition<T>(doc), cancellationToken: cancellationToken);
} #endregion #region Delete public T Delete(string id)
{
return DbSet.FindOneAndDelete(a => a.Id.Equals(id));
} public Task<T> DeleteAsync(string id, CancellationToken cancellationToken = new CancellationToken())
{
return DbSet.FindOneAndDeleteAsync(a => a.Id.Equals(id), null, cancellationToken);
} public Task<DeleteResult> DeleteAsync(Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = new CancellationToken())
{
return DbSet.DeleteManyAsync(predicate, cancellationToken);
} public DeleteResult Delete(Expression<Func<T, bool>> predicate)
{
return DbSet.DeleteMany(predicate);
} #endregion #region Other public long Count(Expression<Func<T, bool>> predicate)
{
return DbSet.Count(predicate);
} public Task<long> CountAsync(Expression<Func<T, bool>> predicate,
CancellationToken cancellationToken = new CancellationToken())
{
return DbSet.CountAsync(predicate, null, cancellationToken);
} public bool Exists(Expression<Func<T, bool>> predicate)
{
return Get(predicate).Any();
} #endregion #region Page public IEnumerable<T> Paged(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,
int pageSize, int pageIndex = )
{
var sort = Builders<T>.Sort.Descending(sortBy);
return DbSet.Find(predicate).Sort(sort).Skip(pageSize * pageIndex - ).Limit(pageSize).ToList();
} public Task<List<T>> PagedAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,
int pageSize, int pageIndex = ,
CancellationToken cancellationToken = new CancellationToken())
{
return Task.Run(() =>
{
var sort = Builders<T>.Sort.Descending(sortBy);
return DbSet.Find(predicate).Sort(sort).Skip(pageSize * pageIndex - ).Limit(pageSize).ToList();
}, cancellationToken);
} #endregion #region Helper /// <summary>
/// 获取类型的所有属性信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TProperty"></typeparam>
/// <param name="select"></param>
/// <returns></returns>
private PropertyInfo[] GetPropertyInfos<TProperty>(Expression<Func<T, TProperty>> select)
{
var body = select.Body;
switch (body.NodeType)
{
case ExpressionType.Parameter:
var parameterExpression = body as ParameterExpression;
if (parameterExpression != null) return parameterExpression.Type.GetProperties();
break;
case ExpressionType.New:
var newExpression = body as NewExpression;
if (newExpression != null)
return newExpression.Members.Select(m => m as PropertyInfo).ToArray();
break;
}
return null;
} #endregion
}
使用如下:
public class MongoDBSetting
{
public string DataBase { get; set; } public string UserName { get; set; } public string Password { get; set; } public List<MongoServers> Services { get; set; }
} public class MongoServers
{
public string Host { get; set; } public int Port { get; set; } = ;
}
public class LogsContext
{
private readonly IMongoDatabase _db; public LogsContext(IOptions<MongoDBSetting> options) {
var permissionSystem =
MongoCredential.CreateCredential(options.Value.DataBase, options.Value.UserName,
options.Value.Password);
var services = new List<MongoServerAddress>();
foreach (var item in options.Value.Services)
{
services.Add(new MongoServerAddress(item.Host, item.Port));
}
var settings = new MongoClientSettings
{
Credentials = new[] {permissionSystem},
Servers = services
}; var _mongoClient = new MongoClient(settings);
_db = _mongoClient.GetDatabase(options.Value.DataBase);
} public IMongoCollection<ErrorLogs> ErrorLog => _db.GetCollection<ErrorLogs>("Error"); public IMongoCollection<ErrorLogs> WarningLog => _db.GetCollection<ErrorLogs>("Warning");
}
public static IServiceCollection UserMongoLog(this IServiceCollection services,
IConfigurationSection configurationSection)
{
services.Configure<MongoDBSetting>(configurationSection);
services.AddSingleton<LogsContext>();
return services;
}
public interface IErrorLogService : IRepository<ErrorLog>
{
}
public class ErrorLogService : MongoRepository<ErrorLog>, IErrorLogService
{
public ErrorLogService(LogsContext dbContext) : base(dbContext.ErrorLog)
{
}
}
最后:
services.UserMongoLog(Configuration.GetSection("Mongo.Log"));
"Mongo.Log": {
"DataBase": "PermissionSystem",
"UserName": "sa",
"Password": "shtx@123",
"Services": [
{
"Host": "192.168.1.6",
"Port": ""
}
]
}
刚学洗使用MongoDB,才疏学浅,请大神多多指教
Asp.Net Core MongoDB的更多相关文章
- ASP.NET Core+MongoDB(一)
项目类库:.Net Standar 2.0web:ASP.NET CORE 2.2 版本 先上图,看我们的解决方案结构: 分别对上面的工程进行说明:1.KYSharpCore:为公共的基础类,最底层 ...
- Asp.Net Core Use MongoDB
前几天在网上想找一下Asp.Net Core使用MongoDB相关的文章,也看了几篇,发现都是在写简单的例子,这样的例子是不能用在生产环境的,不能用的生产环境的.封装一个东西一定是建立在你对这个东西足 ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程
Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...
- Using MongoDB with Web API and ASP.NET Core
MongoDB is a NoSQL document-oriented database that allows you to define JSON based documents which a ...
- asp.net core集成MongoDB
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...
- 问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null
问题描述: POST/PUT to ASP.Net Core with [FromBody] to a MongoDB GeoJsonObjectModel member is always null ...
- ASP.NET Core使用MongoDB数据库
环境:Asp.Net Core Mvc 2.2,MongoDB 4.09 参考文档:http://mongodb.github.io/mongo-csharp-driver/ http://mongo ...
- ASP.NET Core 之 Identity 入门(三)
前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...
随机推荐
- react简书笔记一 环境, git 和 项目 关联
1.. 建立git项目 ( 码云, github 都可以 ), 具体步骤: https://www.cnblogs.com/andy-lehhaxm/p/10720717.html 1.1 git ...
- 一个可以配置阴影方向和颜色的类 CardView 控件 SCardView
一.控件简述 今天给大家推荐一个控件 SCardView ,看名字就很容易才出来它其实就是一个 CardView .把它拿出来,是因为它解决了一些 CardView 无法实现的需求以及简化了 Card ...
- 2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
A Drawing Borders 很多构造方法,下图可能是最简单的了 代码: #include<bits/stdc++.h> using namespace std; ; struct ...
- Spring mvc集成log4j2
前期环境 Spring mvc + Maven + Idea 一.下面开始配置log4j2,先简单演示其如何配置,再仔细了解log4j2用法. 1.1 配置pom.xml,引用log4j2相关包 & ...
- Error during generated code invocation: com.intellij.debugger.engine.evaluation.EvaluateException: Method threw 'java.lang.IllegalAccessError' exception.
场景描述: 再从该数据库中读取数据进行处理的时候,需要将某个字段加入到一个动态的map中,然后需要对该map进行filter过滤,在执行过滤方法的时候报错 Error during generated ...
- go_micro相关书签
https://micro.mu/docs/cn/index.html gomicro文档 https://github.com/micro/go-micro gomicro代码 windows安装 ...
- mongo学习笔记2--索引及表设计
-背景: 鉴于我们使用mongo作为数据库,期间少不了需要添加索引和对业务表进行设计.因此以下我对mongo索引及表设计原则做了一些分享.希望对大家有用,如有错误还望指正~ MongDB的索引类型简介 ...
- leetcode刷题——一些算法技巧总结2.0
异或.与的一点总结(这些位运算真的是骚操作2333) 两个相同的数字:a^a=0 取出一个数最右端为1的那一位:a &=-a 其中-a是在计算机中就是a的补码表示(这样所有的加法运算可以使用同 ...
- 解决angular ui-grid 中添加input date修改日期
需求:在angular ui-grid列表中添加一个日期组件来修改时间. 在angular ui-grid添加了一个html5 date input,后端返回的数据是YYYY-MM-DD,比如:201 ...
- python 基础语法练习回顾
#!/usr/bin/python# -*- coding: UTF-8 -*-import timeimport calendar student = {"age": 7,&qu ...