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 应用程序 ...
随机推荐
- kali 32位 更换 xfce4 桌面
kali 32位默认是gnome桌面,我感觉又难看又卡.下面是换xfce4的方法: 1.安装xfce4: apt install kali-defaults kali-root-login deskt ...
- 跨域获取后台日期-ASP
最近所有的计划都被打乱,生活节奏也有些控制不住,所以在自己还算清醒的时候,把之前一个小功能写下来,对其它人也有些帮助. 需求前景:需要用AJAX跨域获取后台服务器日期. 1.分析需求: 在这个需求中, ...
- Kotlin 继承
Kotlin 中所有类都继承该 Any 类,它是所有类的超类,对于没有超类型声明的类是默认超类: class Example // 从 Any 隐式继承 Any 默认提供了三个函数: equals() ...
- DAY16 模块和包的导入
一.包 1.包的定义 包:就是一系列模块的结合体 2.重点 1.包中一定要有一个专门来管理包中所有模块的文件 2.包名:存放一系列模块的文件夹名字 3.包名(包对象)存放的是管理模块的那个文件的地址, ...
- win2008 401 - 未授权: 由于凭据无效,访问被拒绝。解决方法
iiis中一个小配置的问题,“身份验证”里面“启用匿名身份验证”,编辑匿名身份验证凭据,选中下面的“应用程序池标识” 就可以了
- hql 函数大全
序号 函数名称 说明 类型 支持 使用方法 备注 1 ABS(n) 取绝对值 数学函数 JPAQL HQL ABS(column_name[数字类型对象属性]) 2 SQRT(n) 取平方根 数 ...
- gpu相关
1.查看cuda版本 cat /usr/local/cuda/version.txt 2.查看cudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CU ...
- LNMP的搭建
一.下载安装MySQL 1.1:下载地址:https://dev.mysql.com/downloads/mysql/ 1.2:安装后 1.2.1:解压:tar -xf mysql-8.0.15-li ...
- html计时发送验证码功能的实现
function countdown() { var time=60; setTime=setInterval(function(){ if(time<=0){ clearInterval(se ...
- 2019.3.16数据结构考试(Problem 1. rotinv)(循环逆序对)
Problem 1. rotinvInput file: rotinv.inOutput file: rotinv.outTime limit: 2 secondsMemory limit: 256 ...