using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MongoDB;
using MongoDB.Linq;
using System.Web;
using Commons;
using System.Linq.Expressions;
namespace MongoTest
{
public class DBHelper
{
#region 基本信息
//public static string ConnectionString = System.Web.Configuration.WebConfigurationManager.AppSettings["MongoServer"].ToString();
//public static string DatabaseName = System.Web.Configuration.WebConfigurationManager.AppSettings["MongoDBName"].ToString();
public static string ConnectionString = "server=192.168.1.101:27627";
public static string DatabaseName = "test";
static DBHelper()
{
var builder = new MongoConnectionStringBuilder(ConnectionString)
{
Username = "",
Password = "",
MinimumPoolSize = 2,
MaximumPoolSize = 120,
};
ConnectionString = builder.ToString();
}
/// <summary>
/// 当前Mongo数据库对象
/// </summary>
/// <param name="mongo">Mongo对象</param>
/// <returns>返回当前Mongo数据库对象</returns>
public static IMongoDatabase GetCurrentDataBase(Mongo mongo)
{
return mongo.GetDatabase(DatabaseName);
}
/// <summary>
/// 当前Mongo对象
/// </summary>
public static Mongo CurrentMongo
{
get
{
return new Mongo(ConnectionString);
}
}
#endregion
#region 数据查询
private static IndexOrder GetIndexOrder(DataOrder order)
{
IndexOrder orderby = IndexOrder.Descending;
if (order == DataOrder.Ascending)
{
orderby = IndexOrder.Ascending;
}
else
{
orderby = IndexOrder.Descending;
}
return orderby;
}
/// <summary>
/// 根据Lamda表达式条件获取上一条或下一条数据
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">查询Lamda表达式</param>
/// <param name="order">排序</param>
/// <param name="orderField">排序字段</param>
/// <returns>返回上一条或下一条数据</returns>
public static T GetNextOrPrevBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector, DataOrder order, string orderField) where T : class
{
Mongo mongo = null;
IndexOrder orderby = GetIndexOrder(order);
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
int count = collection.Find<T>(selector).Sort(orderField, orderby).Documents.Count();
if (count > 0)
{
return collection.Find<T>(selector).Sort(orderField, orderby).Limit(1).Documents.Single<T>();
}
else
{
return null;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 根据条件进行查询,并进行分页
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">条件Lamda表达式</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页的显示记录数</param>
/// <returns>返回查询的集合</returns>
public static List<T> GetBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector, int pageIndex, int pageSize) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.Find<T>(selector).Skip((pageIndex - 1) * pageSize).Limit(pageSize).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 根据条件进行查询,并进行分页和排序
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">条件Lamda表达式</param>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页的显示记录数</param>
/// <param name="order">排序规则</param>
/// <param name="orderField">排序字段</param>
/// <returns>返回查询的集合</returns>
public static List<T> GetBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector, int pageIndex, int pageSize, DataOrder order, string orderField) where T : class
{
Mongo mongo = null;
IndexOrder orderby = GetIndexOrder(order);
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.Find<T>(selector).Sort(orderField, orderby).Skip((pageIndex - 1) * pageSize).Limit(pageSize).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 条件查询
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">条件Lamda表达式</param>
/// <returns>返回查询的集合</returns>
public static List<T> GetBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.Find<T>(selector).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 条件查询,并进行排序
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">条件Lamda表达式</param>
/// <param name="order">排序规则</param>
/// <param name="orderField">排序字段</param>
/// <returns>返回查询的集合</returns>
public static List<T> GetBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector, DataOrder order, string orderField) where T : class
{
Mongo mongo = null;
IndexOrder orderby = GetIndexOrder(order);
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.Find<T>(selector).Sort(orderField, orderby).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 返回所有数据
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <returns>返回所有数据的集合</returns>
public static List<T> GetAll<T>() where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.FindAll().Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 返回所有数据,并排序
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="order">排序规则</param>
/// <param name="orderField">排序字段</param>
/// <returns>返回所有数据的集合</returns>
public static List<T> GetAll<T>(DataOrder order, string orderField) where T : class
{
Mongo mongo = null;
IndexOrder orderby = GetIndexOrder(order);
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.FindAll().Sort(orderField, orderby).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 返回所有数据并支持分页
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示的记录数</param>
/// <returns>返回集合</returns>
public static List<T> GetAll<T>(int pageIndex, int pageSize) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.FindAll().Skip((pageIndex - 1) * pageSize).Limit(pageSize).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 返回所有数据并支持分页排序
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="pageIndex">当前页数</param>
/// <param name="pageSize">每页显示的记录数</param>
/// <param name="order">排序规则</param>
/// <param name="orderField">排序字段名</param>
/// <returns>返回集合</returns>
public static List<T> GetAll<T>(int pageIndex, int pageSize, DataOrder order, string orderField) where T : class
{
Mongo mongo = null;
IndexOrder orderby = GetIndexOrder(order);
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.FindAll().Sort(orderField, orderby).Skip((pageIndex - 1) * pageSize).Limit(pageSize).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 返回前几条数据
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="topNumber">返回数量</param>
/// <param name="order">排序规则</param>
/// <param name="orderField">排序字段</param>
/// <returns>返回结果集合</returns>
public static List<T> GetTopList<T>(int topNumber, DataOrder order, string orderField) where T : class
{
Mongo mongo = null;
IndexOrder orderby = GetIndexOrder(order);
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.FindAll().Sort(orderField, orderby).Limit(topNumber).Documents.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 根据条件查询一个对象
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">查询条件Lamda表达式</param>
/// <returns></returns>
public static T GetOneBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.FindOne<T>(selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 统计总记录数
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <returns>返回总记录数</returns>
public static long GetTotalCount<T>() where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.Count();
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 根据条件获取总记录数
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">查询条件委托</param>
/// <returns>返回总记录数</returns>
public static int GetTotalCountBySearch<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
IMongoCollection<T> collection = db.GetCollection<T>();
return collection.Count<T>(selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
#region 数据插入
/// <summary>
/// 插入数据
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="t">要插入的对象</param>
public static void Insert<T>(T t) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
db.GetCollection<T>().Save(t);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
#region 数据更新
/// <summary>
/// 更新数据(带条件)
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="t">更新的对象修改</param>
/// <param name="selector">更新的条件Lamda表达式</param>
public static void Update<T>(T t, System.Linq.Expressions.Expression<Func<T, bool>> selector) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
db.GetCollection<T>().Update<T>(t, selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
/// <summary>
/// 更新数据
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="t">要更新的对象</param>
public static void Update<T>(T t) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
db.GetCollection<T>().Save(t);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
#region 数据删除
/// <summary>
/// 数据删除
/// </summary>
/// <typeparam name="T">类型参数</typeparam>
/// <param name="selector">查询的条件Lamda表达式</param>
public static void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> selector) where T : class
{
Mongo mongo = null;
try
{
mongo = CurrentMongo;
mongo.Connect();
var db = GetCurrentDataBase(mongo);
db.GetCollection<T>().Remove<T>(selector);
}
catch (Exception ex)
{
throw ex;
}
finally
{
mongo.Disconnect();
mongo.Dispose();
}
}
#endregion
}
}