1. 程式人生 > >MongoDB基本操作之(mongodb的簡單封裝)

MongoDB基本操作之(mongodb的簡單封裝)

具體的程式碼實現如下:

/*********************************************
 * CLR 版本:       4.0.30319.42000
 * 類 名 稱:       MongoHelper
 * 機器名稱:       MS-20170310FLQY
 * 名稱空間:       ConsoleApplication1
 * 文 件 名:       MongoHelper
 * 建立時間:       2017/6/28 11:19:40
 * 作    者:       Choj
 * 說    明:     
 * 修改時間:
 * 修 改 人:
 * 
*********************************************/

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Choj.NoSql
{
    /// <summary>
    /// MongoHelper
    /// </summary>
    public class MongoHelper<T> where T : class, new()
    {
        #region 基本屬性
        /// <summary>
        /// 資料庫連線
        /// </summary>
        private string connString = "mongodb://127.0.0.1:27017";
        /// <summary>
        /// 指定的資料庫
        /// </summary>
        private string dbName = "dbName";
        /// <summary>
        /// 指定的集合
        /// </summary>
        private string colName = "colName";
        /// <summary>
        /// 建立資料連線
        /// </summary>
        static MongoServer server;
        /// <summary>
        /// 獲取指定資料庫
        /// </summary>
        static MongoDatabase db;
        /// <summary>
        /// 獲取集合
        /// </summary>
        static MongoCollection<T> col;
        #endregion

        #region 建構函式
        /// <summary>
        /// 建構函式
        /// </summary>
        public MongoHelper()
        {
            Init(null, null, null);
        }
        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="connString">連線字串</param>
        public MongoHelper(string connString)
        {
            Init(connString, null, null);
        }
        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="connString">連線字串</param>
        /// <param name="dbName">資料庫名</param>
        public MongoHelper(string connString, string dbName)
        {
            Init(connString, dbName, null);
        }
        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="connString">連線字串</param>
        /// <param name="dbName">資料庫名</param>
        /// <param name="colName">資料庫表名</param>
        public MongoHelper(string connString, string dbName, string colName)
        {
            Init(connString, dbName, colName);
        }
        #endregion

        #region 初始化
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="connString">連線字串</param>
        /// <param name="dbName">資料庫</param>
        /// <param name="colName">集合名</param>
        public void Init(string connString = null, string dbName = null, string colName = null)
        {
            if (server == null)
            {
                server = new MongoClient(connString).GetServer();
                db = server.GetDatabase(dbName);
                col = db.GetCollection<T>(colName);
            }
        } 
        #endregion

        #region 基本方法
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="T">T</param>
        /// <returns></returns>
        public WriteConcernResult Insert(T t)
        {
            return col.Insert(t);
        }

        /// <summary>
        /// 根據bsonValue 刪除
        /// </summary>
        /// <param name="bsonValue"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public WriteConcernResult Remove(string bsonValue, string name = "_id")
        {
            //查詢當前的文件
            var query = Query.EQ(name, bsonValue);

            //刪除文件
            return col.Remove(query);
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="t">泛型</param>
        /// <param name="bsonValue">bsonValue的值</param>
        /// <param name="name"></param>
        /// <returns></returns>
        public WriteConcernResult Update(T t, string bsonValue, string name = "_id")
        {
            //BsonDocument
            var bd = BsonExtensionMethods.ToBsonDocument(t);
            //query
            var query = Query.EQ(name, bsonValue);

            return col.Update(query, new UpdateDocument(bd));
        }

        /// <summary>
        /// 獲取某一文件
        /// </summary>
        /// <param name="bsonValue"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public T GetObject(string bsonValue, string name = "_id")
        {
            //條件查詢            
            return col.FindOne(Query.EQ(name, bsonValue));
        }

        /// <summary>
        /// 按條件查詢
        /// </summary>
        /// <param name="pageInfo">分頁的資訊</param>
        /// <returns></returns>
        public MongoCursor<T> GetListByPage(IMongoQuery query, PageInfo pageInfo, out long record)
        {
            var result = col.Find(query).SetSkip((pageInfo.PageIndex - 1) * pageInfo.PageSize).SetLimit(pageInfo.PageSize);

            if (pageInfo.Sort == null || pageInfo.Sort.Count() == 0)
            { }
            else
            {
                if (pageInfo.Direction == Direction.DESC)
                {
                    result = result.SetSortOrder(SortBy.Descending(pageInfo.Sort));
                }
                else
                {
                    result = result.SetSortOrder(SortBy.Ascending(pageInfo.Sort));
                }
            }
            record = result.Count();

            return result;
        }

        /// <summary>
        /// 查詢所有
        /// </summary>
        public MongoCursor<T> GetAll()
        {
            return col.FindAll();
        }

        /// <summary>
        /// 建立索引
        /// </summary>
        /// <param name="kNames">索引的值</param>
        public void EnsureIndex(string[] kNames)
        {
            var doc = new MongoDB.Driver.IndexKeysDocument();
            foreach (var name in kNames)
            {
                doc.Add(name, 1);
            }
            col.EnsureIndex(doc);
        }

        /// <summary>
        /// 建立索引
        /// </summary>
        /// <param name="kNames">索引的值</param>
        /// <returns></returns>
        public WriteConcernResult CreateIndex(string[] kNames)
        {
            var doc = new MongoDB.Driver.IndexKeysDocument();
            foreach (var name in kNames)
            {
                doc.Add(name, 1);
            }

            return col.CreateIndex(doc);
        }

        /// <summary>
        /// 獲取索引
        /// </summary>
        /// <returns></returns>
        public GetIndexesResult GetIndexes()
        {
            return col.GetIndexes();
        }

        /// <summary>
        /// 刪除文件
        /// </summary>
        /// <returns></returns>
        public CommandResult Drop()
        {
            return col.Drop();
        }

        /// <summary>
        /// 刪除所有的索引
        /// </summary>
        /// <returns></returns>
        public CommandResult DropAllIndexes()
        {
            return col.DropAllIndexes();
        }

        /// <summary>
        /// 刪除制定的索引
        /// </summary>
        /// <param name="names"></param>
        /// <returns></returns>
        public CommandResult DropIndex(string[] names)
        {
            return col.DropIndex(names);
        }

        /// <summary>
        /// 刪除制定的索引名稱
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public CommandResult DropIndexByName(string name)
        {
            return col.DropIndexByName(name);
        }

        /// <summary>
        /// 驗證文件是否存在
        /// </summary>
        /// <returns></returns>
        public bool Exists()
        {
            return col.Exists();
        }

        /// <summary>
        /// 查詢
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public MongoCursor<T> sad(IMongoQuery query)
        {
            return col.Find(query);
        }

        /// <summary>
        /// 查詢
        /// </summary>
        /// <param name="documentType"></param>
        /// <returns></returns>
        public MongoCursor FindAllAs(Type documentType)
        {
            return col.FindAllAs(documentType);
        }

        /// <summary>
        /// 查詢並刪除
        /// </summary>
        /// <param name="query">查詢條件</param>
        /// <param name="sortBy">排序方式</param>
        /// <param name="update">更新</param>
        /// <param name="returnNew">返回新的值</param>
        /// <param name="upSert"></param>
        /// <returns></returns>
        public FindAndModifyResult FindAndModify(IMongoQuery query, IMongoSortBy sortBy, IMongoUpdate update, bool returnNew = false, bool upSert = false)
        {
            return col.FindAndModify(query, sortBy, update, returnNew, upSert);
        }

        /// <summary>
        /// 查詢並且刪除
        /// </summary>
        /// <param name="query"></param>
        /// <param name="sortBy"></param>
        /// <returns></returns>
        public FindAndModifyResult FindAndModify(IMongoQuery query, IMongoSortBy sortBy)
        {
            return col.FindAndRemove(query, sortBy);
        }

        /// <summary>
        /// 系統會隨機查詢獲取到滿足條件的一條記錄
        /// </summary>
        /// <returns></returns>
        public T FindOne()
        {
            return col.FindOne();
        }

        /// <summary>
        /// 根據Id獲取第一個
        /// </summary>
        /// <param name="bsonValue"></param>
        public T FindOneById(BsonValue bsonValue)
        {
            return col.FindOneById(bsonValue);
        }

        /// <summary>
        /// 根據Id獲取第一個
        /// </summary>
        /// <param name="documentType">文件型別</param>
        /// <param name="bsonValue">id</param>
        /// <returns></returns>
        public object FindOneById(Type documentType,BsonValue bsonValue)
        {
            return col.FindOneByIdAs(documentType, bsonValue);
        }

        /// <summary>
        /// 根據文件名稱
        /// </summary>
        /// <returns></returns>
        public string FullName()
        {
            return col.FullName;
        }

        /// <summary>
        /// 根據當前的條件或者最近的文件
        /// </summary>
        /// <param name="query"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="limit"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public GeoNearResult<T> GeoNear(IMongoQuery query, double x, double y, int limit,IMongoGeoNearOptions options)
        {
            return col.GeoNear(query, x, y, limit, options);
        }

        /// <summary>
        /// 獲取當前的集合的狀態
        /// </summary>
        /// <returns></returns>
        public CollectionStatsResult GetStats()
        {
            return col.GetStats();
        }

        /// <summary>
        /// 獲取總的資料大小
        /// </summary>
        public long GetTotalDataSize()
        {
            return col.GetTotalDataSize();
        }

        /// <summary>
        /// 獲取總的儲存大小
        /// </summary>
        /// <returns></returns>
        public long GetTotalStorageSize()
        {
            return col.GetTotalStorageSize();
        }

        /// <summary>
        /// 驗證當前的索引是否存在
        /// </summary>
        /// <param name="names"></param>
        public bool IndexExists(string[] names)
        {
            return col.IndexExists(names);
        }

        /// <summary>
        /// 驗證當前的索引是否存在
        /// </summary>
        /// <param name="names"></param>
        public bool IndexExistsByName(string name)
        {
            return col.IndexExistsByName(name);
        }

        /// <summary>
        /// 插入資料
        /// </summary>
        /// <param name="t"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public WriteConcernResult Insert(T t, MongoInsertOptions options)
        {
            return col.Insert(t, options);
        }

        /// <summary>
        /// 批量插入資料
        /// </summary>
        /// <param name="lstT"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public IEnumerable<WriteConcernResult> Insert(IEnumerable<T> lstT, MongoInsertOptions options = null)
        {
            if (options == null)
            {
                return col.InsertBatch(lstT);
            }
            else
            {
                return col.InsertBatch(lstT, options);
            }
        }

        /// <summary>
        /// 標識否允許刪除裡面的文件資料
        /// </summary>
        /// <returns></returns>
        public bool IsCapped()
        {
            return col.IsCapped();
        }

        /// <summary>
        /// 獲取集合的名稱
        /// </summary>
        /// <returns></returns>
        public string Name()
        {
            return col.Name;
        }

        /// <summary>
        /// 刪除所有的資料
        /// </summary>
        /// <returns></returns>
        public WriteConcernResult RemoveAll()
        {
            return col.RemoveAll();
        }

        /// <summary>
        /// 儲存文件
        /// </summary>
        /// <param name="document"></param>
        /// <returns></returns>
        public WriteConcernResult Save(T document)
        {
            return col.Save(document);
        }

        /// <summary>
        /// 驗證集合
        /// </summary>
        /// <returns></returns>
        public ValidateCollectionResult Validate()
        {
            return col.Validate();
        }

        /// <summary>
        /// 獲取當前表的相關資訊
        /// </summary>
        /// <returns></returns>
        public MongoCollection<T> GetTableInfo()
        {
            //建立資料連線
            server = new MongoClient(connString).GetServer();
            //獲取指定資料庫
            db = server.GetDatabase(dbName);

            //獲取表
            col = db.GetCollection<T>(colName);

            return col;
        }
        #endregion
    }

    #region 分頁
    /// <summary>
    /// 分頁
    /// </summary>
    public class PageInfo
    {
        private int pageIndex;
        /// <summary>
        /// 當前的頁
        /// </summary>
        public int PageIndex
        {
            get { return pageIndex; }
            set { pageIndex = value; }
        }
        private int pageSize;
        /// <summary>
        /// 每頁的大小
        /// </summary>
        public int PageSize
        {
            get { return pageSize; }
            set { pageSize = value; }
        }
        private string[] sort;
        /// <summary>
        /// 排序的列名
        /// </summary>
        public string[] Sort
        {
            get { return sort; }
            set { sort = value; }
        }
        private Direction direction;
        /// <summary>
        /// 排序方向
        /// </summary>
        public Direction Direction
        {
            get { return direction; }
            set { direction = value; }
        }
    }
    /// <summary>
    /// 排序的方向
    /// </summary>
    public enum Direction
    {
        DESC,
        ASC
    }
    #endregion
}