废话不说直接上代码;

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的更多相关文章

  1. ASP.NET Core+MongoDB(一)

    项目类库:.Net Standar 2.0web:ASP.NET CORE 2.2 版本 先上图,看我们的解决方案结构: 分别对上面的工程进行说明:1.KYSharpCore:为公共的基础类,最底层 ...

  2. Asp.Net Core Use MongoDB

    前几天在网上想找一下Asp.Net Core使用MongoDB相关的文章,也看了几篇,发现都是在写简单的例子,这样的例子是不能用在生产环境的,不能用的生产环境的.封装一个东西一定是建立在你对这个东西足 ...

  3. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  4. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

  5. 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 ...

  6. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

  7. 问题:调用 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 ...

  8. ASP.NET Core使用MongoDB数据库

    环境:Asp.Net Core Mvc 2.2,MongoDB 4.09 参考文档:http://mongodb.github.io/mongo-csharp-driver/ http://mongo ...

  9. ASP.NET Core 之 Identity 入门(三)

    前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...

随机推荐

  1. jmeter 学习笔记

    beanshell内置对象 vars是针对单线程,使用${varName}访问var变量值 props是所有线程共享,使用${__P(propName,)}访问prop变量值 如何让variable在 ...

  2. Linux——高效玩转命令行

    [0]统计文件or压缩文件的行数 zcat file.gz | sed -n '$='   #迅速.直接打印出多少行.-n 取消默认的输出,使用安静(silent)模式    '$='  不知道是什么 ...

  3. Economics degrees

    Economics degrees Name game"> 经济学学位"> 名称痕戏 Luring students with a new label 新瓶旧酒吸引学生 ...

  4. 如何快速连接无线Wifi 使用二维码

    无线Wifi现在已经很普及了,无论是在家.还是在单位.书店.餐馆.咖啡馆等公共场所,只要手机打开Wifi,选择相应的无线Wifi热点,手工输入密码后,即可通过无线Wifi访问互联网. 如何让用户更方便 ...

  5. redis缓存中间件基础

    前序: 默认使用SimpleCacheConfiguration 组件ConcurrentMapCacheManager==ConcurrentMapCache将数据保存在ConcurrentMap& ...

  6. Day 4 变量常量

    编辑语言的分类 编程语言,他是人与计算机沟通的一种介质 机器语言 计算机只认识0和1,为了和计算机沟通,你也得认识0和1 优点:执行效率快 缺点:普通人根本就写不了这种代码,开发效率低 汇编语言 他还 ...

  7. python 学习笔记 4 ----> dive into python 3

    解析 列表解析.字典解析.集合解析 浏览本地文件系统的模块: 1 os 2 os.path 3 glob os模块:获取(和修改)本地目录.文件进程.环境变量等信息 os.path模块:包含了操作路径 ...

  8. Lua完全自学手册(图文教程)

    Programming in Lua程序设计   http://book.luaer.cn/ Lua完全自学手册(图文教程) https://edu.aliyun.com/course/506/les ...

  9. CSS自定义多个字体引用

    在 HTML 中,提供给我们的默认字体有很多,但因为在电脑上安装的字体有限,所以很多时候不能呈现出和设计稿上一样的效果,这时候我们就需要使用 css3 提供的 @font-face 来实现个性化字体了 ...

  10. composer常用的一些命令\参数\说明

    安装 curl -sS https://getcomposer.org/installer | php 或者 php -r "readfile('https://getcomposer.or ...