废话不说直接上代码;

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. SpringBoot和druid数据源集成Jpa

    1.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. Demo整合

    1.图片上传:  https://github.com/842549829/WebUploader 2.百度编辑器: https://github.com/842549829/Ueditor 3.安卓 ...

  3. acure使用

    打开,选择用IE浏览器,如果选择Chrome浏览器会提示让安装插件

  4. guxh的python笔记十一:异常处理

    1,抓错方法 name = [0, 1, 2] try: name[3] except IndexError as exc: # 抓单个错误,打印错误信息e print(exc) except (In ...

  5. maven install报错 Failed to execute goal on project my-manager-mapper: Could not resolve dependencies for project com.my:my-manager-mapper:jar:0.0.1-SNAPSHOT:

    报错信息为: [ERROR] Failed to execute goal on project my-manager-mapper: Could not resolve dependencies f ...

  6. DPDK kni创建要先于port开启

    DPDK kni创建要先于port开启 1. DPDK kni创建使用API:- rte_kni_init- rte_kni_alloc 2. DPDK port开启使用API:- rte_eth_d ...

  7. css中position 定位的兼容性,以及定位的使用及层级的应用

    一.首先我们来看看定位的兼容性,当然是在IE6.7但是现在大多数公司都已经不考虑了 我们就作为一个了解吧: 1.在IE67下,子元素有相对定位的话,父级的overflow:hidden包不住子元素 解 ...

  8. mybatis注解调用存储过程

    mapper @SelectProvider(type = RoleMenuSqlProvider.class,method = "updateRoleMenuRelation") ...

  9. 【分享】谈CSS3中display属性的flex布局

    最近在学习微信小程序(重新学习微信小程序),在设计首页布局的时候,新认识了一种布局方式display:flex .guide-top{ height: 36%; display: flex; /*fl ...

  10. markdown首行缩进

    首行缩进两个字符:(每个表示一个空格,连续使用两个即可)   半角的空格  全角的空格