using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; using System.Threading.Tasks; using JiShe.CollectBus.Common.Interfaces; using JiShe.CollectBus.EntityFrameworkCore; using Volo.Abp.Timing; namespace JiShe.CollectBus.MongoDB { public class MongoBaseRepository : IMongoRepository where T : class, new() { private readonly IMongoContext _context; private readonly IMongoCollection _dbSet; private readonly IClock _clock; public MongoBaseRepository(IMongoContext context, IClock clock) { _context = context; _clock = clock; var collectionName = typeof(T).GetCustomAttribute()?.Name ?? typeof(T).Name; _dbSet = _context.GetCollection(collectionName); } #region 事务操作示例 /// /// 事务添加数据 /// /// MongoDB 会话(session)对象 /// 添加数据 /// public async Task AddTransactionsAsync(IClientSessionHandle session, T objData) { await _context.AddCommandAsync(async (session) => await _dbSet.InsertOneAsync(objData)); } /// /// 事务数据删除 /// /// MongoDB 会话(session)对象 /// objectId /// public async Task DeleteTransactionsAsync(IClientSessionHandle session, string id) { await _context.AddCommandAsync((session) => _dbSet.DeleteOneAsync(Builders.Filter.Eq(" _id ", id))); } /// /// 事务异步局部更新(仅更新一条记录) /// /// MongoDB 会话(session)对象 /// 过滤器 /// 更新条件 /// public async Task UpdateTransactionsAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update) { await _context.AddCommandAsync((session) => _dbSet.UpdateOneAsync(filter, update)); } #endregion #region 添加相关操作 /// /// 添加数据 /// /// 添加数据 /// public async Task AddAsync(T objData) { if (typeof(IReceived).IsAssignableFrom(typeof(T))) { (objData as IReceived)!.ReceivedTime = $"{_clock.Now:yyyy-MM-dd HH:mm:ss}"; } await _dbSet.InsertOneAsync(objData); } /// /// 批量插入 /// /// 实体集合 /// public async Task InsertManyAsync(List objDatas) { await _dbSet.InsertManyAsync(objDatas); } #endregion #region 删除相关操作 /// /// 数据删除 /// /// objectId /// public async Task DeleteAsync(string id) { await _dbSet.DeleteOneAsync(Builders.Filter.Eq("_id", new ObjectId(id))); } /// /// 异步删除多条数据 /// /// 删除的条件 /// public async Task DeleteManyAsync(FilterDefinition filter) { return await _dbSet.DeleteManyAsync(filter); } #endregion #region 修改相关操作 /// /// 指定对象异步修改一条数据 /// /// 要修改的对象 /// 修改条件 /// public async Task UpdateAsync(T obj, string id) { //修改条件 FilterDefinition filter = Builders.Filter.Eq("_id", new ObjectId(id)); //要修改的字段 var list = new List>(); foreach (var item in obj.GetType().GetProperties()) { if (item.Name.ToLower() == "id") continue; list.Add(Builders.Update.Set(item.Name, item.GetValue(obj))); } var updatefilter = Builders.Update.Combine(list); await _dbSet.UpdateOneAsync(filter, updatefilter); } /// /// 局部更新(仅更新一条记录) /// x.Id == 1 && x.Age > 18 && x.Gender == 0]]> /// new T{ RealName = "Ray", Gender = 1}]]> /// /// 筛选条件 /// 更新条件 /// public async Task UpdateAsync(Expression> expression, Expression> entity) { var fieldList = new List>(); if (entity.Body is MemberInitExpression param) { foreach (var item in param.Bindings) { var propertyName = item.Member.Name; object propertyValue = null; if (item is not MemberAssignment memberAssignment) continue; if (memberAssignment.Expression.NodeType == ExpressionType.Constant) { if (memberAssignment.Expression is ConstantExpression constantExpression) propertyValue = constantExpression.Value; } else { propertyValue = Expression.Lambda(memberAssignment.Expression, null).Compile().DynamicInvoke(); } if (propertyName != "_id") //实体键_id不允许更新 { fieldList.Add(Builders.Update.Set(propertyName, propertyValue)); } } } await _dbSet.UpdateOneAsync(expression, Builders.Update.Combine(fieldList)); } /// /// 异步局部更新(仅更新一条记录) /// /// 过滤器 /// 更新条件 /// public async Task UpdateAsync(FilterDefinition filter, UpdateDefinition update) { await _dbSet.UpdateOneAsync(filter, update); } /// /// 异步局部更新(仅更新多条记录) /// /// 筛选条件 /// 更新条件 /// public async Task UpdateManyAsync(Expression> expression, UpdateDefinition update) { await _dbSet.UpdateManyAsync(expression, update); } /// /// 异步批量修改数据 /// /// 要修改的字段 /// 更新条件 /// public async Task UpdateManayAsync(Dictionary dic, FilterDefinition filter) { T t = new T(); //要修改的字段 var list = new List>(); foreach (var item in t.GetType().GetProperties()) { if (!dic.ContainsKey(item.Name)) continue; var value = dic[item.Name]; list.Add(Builders.Update.Set(item.Name, value)); } var updatefilter = Builders.Update.Combine(list); return await _dbSet.UpdateManyAsync(filter, updatefilter); } #endregion #region 查询统计相关操作 /// /// 通过ID主键获取数据 /// /// objectId /// public async Task GetByIdAsync(string id) { var queryData = await _dbSet.FindAsync(Builders.Filter.Eq("_id", new ObjectId(id))); return queryData.FirstOrDefault(); } /// /// 获取所有数据 /// /// public async Task> GetAllAsync() { var queryAllData = await _dbSet.FindAsync(Builders.Filter.Empty); return queryAllData.ToList(); } /// /// 获取记录数 /// /// 筛选条件 /// public async Task CountAsync(Expression> expression) { return await _dbSet.CountDocumentsAsync(expression); } /// /// 获取记录数 /// /// 过滤器 /// public async Task CountAsync(FilterDefinition filter) { return await _dbSet.CountDocumentsAsync(filter); } /// /// 判断是否存在 /// /// 条件 /// public async Task ExistsAsync(Expression> predicate) { return await Task.FromResult(_dbSet.AsQueryable().Any(predicate)); } /// /// 异步查询集合 /// /// 查询条件 /// 要查询的字段,不写时查询全部 /// 要排序的字段 /// public async Task> FindListAsync(FilterDefinition filter, string[]? field = null, SortDefinition? sort = null) { //不指定查询字段 if (field == null || field.Length == 0) { if (sort == null) return await _dbSet.Find(filter).ToListAsync(); return await _dbSet.Find(filter).Sort(sort).ToListAsync(); } //指定查询字段 var fieldList = new List>(); for (int i = 0; i < field.Length; i++) { fieldList.Add(Builders.Projection.Include(field[i].ToString())); } var projection = Builders.Projection.Combine(fieldList); fieldList?.Clear(); //不排序 if (sort == null) return await _dbSet.Find(filter).Project(projection).ToListAsync(); //排序查询 return await _dbSet.Find(filter).Sort(sort).Project(projection).ToListAsync(); } /// /// 异步分页查询集合 /// /// 查询条件 /// 当前页 /// 页容量 /// 要查询的字段,不写时查询全部 /// 要排序的字段 /// public async Task> FindListByPageAsync(FilterDefinition filter, int pageIndex, int pageSize, string[]? field = null, SortDefinition? sort = null) { //不指定查询字段 if (field == null || field.Length == 0) { if (sort == null) return await _dbSet.Find(filter).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); //进行排序 return await _dbSet.Find(filter).Sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); } //指定查询字段 var fieldList = new List>(); for (int i = 0; i < field.Length; i++) { fieldList.Add(Builders.Projection.Include(field[i].ToString())); } var projection = Builders.Projection.Combine(fieldList); fieldList?.Clear(); //不排序 if (sort == null) return await _dbSet.Find(filter).Project(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); //排序查询 return await _dbSet.Find(filter).Sort(sort).Project(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToListAsync(); } #endregion } }