C# Mongodb 封装类

1.  依赖包 MongoDB.Driver; MongoDB.Json; MongoDB.Bson;

2. 上代码

 

  1 using MongoDB.Driver;
  2 using System;
  3 using System.Collections.Generic;
  4 using System.Text;
  5 
  6 using System.Linq;
  7 using System.Linq.Expressions;
  8 using System.Reflection;
  9 using MongoDB.Driver.Linq;
 10 
 11 namespace Common
 12 {
 13 
 14 
 15     public class MongodbHelper
 16     {
 17         protected static MongoClient client;
 18 
 19         public MongodbHelper()
 20         {
 21             client = new MongoClient("mongodb://localhost:27017");
 22         }
 23         static MongodbHelper()
 24         {
 25             client = new MongoClient("mongodb://localhost:27017");
 26         }
 27         /// <summary>
 28         /// 获取 Collection 信息
 29         /// </summary>
 30         /// <typeparam name="T">实体类型</typeparam>
 31         /// <param name="collName">Collection 名称</param>
 32         /// <param name="dbName">DBase名称</param>
 33         /// <returns></returns>
 34         public static MyCollection<T> GetCollection<T>(string collName, string dbName)
 35         {
 36             MyCollection<T> mycollection = new MyCollection<T>();
 37             IMongoDatabase database = client.GetDatabase(dbName);
 38             IMongoCollection<T> collection = database.GetCollection<T>(collName);
 39             mycollection.collection = collection;
 40             return mycollection;
 41         }
 42     }
 43 
 44     public class MyCollection<T>
 45     {
 46         public IMongoCollection<T> collection;
 47 
 48         /// <summary>
 49         /// 查询数据 延迟加载 后期可以使用Linq  Lambda处理数据
 50         /// </summary>
 51         /// <returns></returns>
 52         public IMongoQueryable<T> QueryData()
 53         {
 54             var list = collection.AsQueryable<T>();
 55             return list;
 56         }
 57         /// <summary>
 58         /// 查询所有数据
 59         /// </summary>
 60         /// <param name="expression"></param>
 61         /// <returns></returns>
 62         public List<T> QueryData(Expression<Func<T, bool>> expression)
 63         {
 64             var list = collection.AsQueryable().Where(expression);
 65             return list.ToList<T>();
 66         }
 67 
 68         /// <summary>
 69         /// 分页查询
 70         /// </summary>
 71         /// <param name="expressio"></param>
 72         /// <param name="pageInfo"></param>
 73         /// <returns></returns>
 74         public PageInfo<T> QueryData(Expression<Func<T, bool>> expressio, PageInfo<T> pageInfo)
 75         {
 76             List<T> list = null;
 77             pageInfo.Totoal = collection.AsQueryable<T>().Count();
 78             pageInfo.PageNum = (int)Math.Ceiling(pageInfo.Totoal / pageInfo.PageSize * 0.1);
 79             if (pageInfo == null || pageInfo.IsAll == true)
 80                 if (expressio != null)
 81                     list = collection.AsQueryable<T>().Where(expressio).ToList();
 82                 else list = collection.AsQueryable<T>().ToList();
 83             else if (expressio != null)
 84             {
 85                 list = collection.AsQueryable<T>().Where(expressio).Skip(pageInfo.PageSize * (pageInfo.PageIndex - 1)).Take(pageInfo.PageSize).ToList();
 86             }
 87             else
 88             {
 89                 list = collection.AsQueryable<T>().Skip(pageInfo.PageSize * (pageInfo.PageIndex - 1)).Take(pageInfo.PageSize).ToList();
 90             }
 91             pageInfo.Data = list;
 92             return pageInfo;
 93         }
 94 
 95         /// <summary>
 96         /// 新增一条数据(文档)
 97         /// </summary>
 98         /// <param name="ts"></param>
 99         public void AddDoc(T ts)
100         {
101             collection.InsertOne(ts);
102         }
103         /// <summary>
104         /// 批量新增多个文档
105         /// </summary>
106         /// <param name="ts"></param>
107         public void AddDocs(List<T> ts)
108         {
109             collection.InsertMany(ts);
110         }
111         /// <summary>
112         /// 更新文档  不存在就新增
113         /// </summary>
114         /// <param name="filter"></param>
115         /// <param name="t"></param>
116         public void UpdateDoc(Expression<Func<T, bool>> filter, T t)
117         {
118             // FilterDefinition<T> filter = null;
119             //  UpdateDefinition<T> update = Builders<T>.Update.ToBsonDocument();//   null;// Builders<T>.Update.
120             var newData = BuildQueryOption(t);
121             UpdateResult result = collection.UpdateOne(filter, newData, new UpdateOptions { IsUpsert = true });
122         }
123         /// <summary>
124         /// 删除文档   
125         /// </summary>
126         /// <param name="predicate"></param>
127         public void Detele(Expression<Func<T, bool>> predicate)
128         {
129             var result = collection.DeleteMany(predicate);//.ConfigureAwait(false);
130                                                           // return result.DeletedCount;
131         }
132         /// <summary>
133         /// 利用反射创建 更新字段 (这里没有处理空)
134         /// </summary>
135         /// <param name="doc"></param>
136         /// <returns></returns>
137         private UpdateDefinition<T> BuildQueryOption(T doc)
138         {
139             var update = Builders<T>.Update;
140             var updates = new List<UpdateDefinition<T>>();
141 
142             var t = doc.GetType();
143             var proper = t.GetProperties();
144             foreach (PropertyInfo info in proper)
145             {
146                 var value = info.GetValue(doc);
147                 if (value != null)
148                 {
149                     updates.Add(update.Set(info.Name, info.GetValue(doc)));
150                 }
151 
152             }
153             // update.Combine(updates);
154             return update.Combine(updates);
155         }
156     }
157     /// <summary>
158     /// 分页信息
159     /// </summary>
160     /// <typeparam name="T"></typeparam>
161     public class PageInfo<T>
162     {
163         public bool IsAll { get; set; } = false;
164         public int PageSize { get; set; } = 100;
165         public int PageIndex { get; set; } = 1;
166         public long Totoal { get; set; }
167 
168         public int PageNum { get; set; }
169 
170         public List<T> Data { get; set; }
171     }
172 }
View Code

3. 测试方法

using Common;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;

namespace ZhiHuHot
{
    public class TestMongo
    {

        public void GetHot()
        {
            MyCollection<HotInfo> collection = MongodbHelper.GetCollection<HotInfo>("ZhiHuHot", "ZhiHu");

            Expression<Func<HotInfo, bool>> predicate = null;

            predicate = a => a.HotID.Equals(391481443);

            PageInfo<HotInfo> hots = collection.QueryData(null, new PageInfo<HotInfo>());
        }
    }
}
View Code

 

posted @ 2020-05-12 12:19  我很好123  阅读(1113)  评论(0编辑  收藏  举报