.NET平臺下使用MongoDB入門教程

  適合人羣:徹底沒有接觸MongoDB或對MongoDB有一點了解的C#開發人員。由於本文是一篇入門級的文章。html

1、瞭解MongoDB

   MongoDB是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。mongodb

   MongoDB是一個高性能,開源,無模式的文檔型數據庫,是當前NoSql數據庫中比較熱門的一種。shell

     MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構很是鬆散,是相似json的bjson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。數據庫

  MongoDB服務端可運行在LinuxWindows或mac os x平臺,支持32位和64位應用,默認端口爲27017。推薦運行在64位平臺,由於MongoDB在32位模式運行時支持的最大文件尺寸爲2GBexpress

  (百度百科)json

2、MongoDB特色

  它的特色是高性能、易部署、易使用,存儲數據很是方便。主要功能特性有:windows

  1)面向集合存儲,易存儲對象類型的數據。xcode

  2)模式自由。服務器

  3)支持動態查詢。網絡

  4)支持徹底索引,包含內部對象。

  5)支持查詢。

  6)支持複製和故障恢復。

  7)使用高效的二進制數據存儲,包括大型對象(如視頻等)。

  8)自動處理碎片,以支持雲計算層次的擴展性。

  9)支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

  10)文件存儲格式爲BSON(一種JSON的擴展)。

  11)可經過網絡訪問。

  (百度百科)

3、安裝及經常使用命令

3.1 下載安裝

MongoDB下載地址:https://www.mongodb.com/download-center#community

安裝以後目錄bin文件夾下會有一堆exe文件

Mongod.exe 鏈接到mongo數據庫服務器的,即服務器端。

Mongo.exe 啓動MongoDB shell的,即客戶端。

mongodump.exe 邏輯備份工具。

mongorestore.exe 邏輯恢復工具。

mongoexport.exe  數據導出工具。

mongoimport.exe  數據導入工具。

3.2 啓動服務器

 新建dbpath用來存儲數據文件 隨便一個路徑均可以,d:\data\db (沒有這個目錄的話會報錯

 CMD命令啓動

3.3 經常使用操做

雙擊mongo.exe進行操做

>use DATABASE_NAME //若是數據庫不存在,則建立數據庫,不然切換到指定數據庫。

>show dbs //顯示全部數據庫

>show collections //顯示當前數據庫下的全部集合

>db.runoob.insert({"name":"菜鳥教程","taxcode":"123456"}) //添加數據

> db.runoob.update({'name':'菜鳥教程'},{'$set':{'taxcode':'test'}},upsert=true,multi=false) //name爲菜鳥教程 更新記錄taxcode爲test

>db.runoob.find() //查詢數據

> db.runoob.remove() //刪除全部數據

> db.runoob.remove({'name':'菜鳥教程'}) //刪除記錄name爲菜鳥教程

>db.dropDatabase() //刪除當前數據庫

3.4 其餘命令

db.AddUser(username,password)  添加用戶
db.auth(usrename,password)     設置數據庫鏈接驗證
db.cloneDataBase(fromhost)     從目標服務器克隆一個數據庫
db.commandHelp(name)           returns the help for the command
db.copyDatabase(fromdb,todb,fromhost)  複製數據庫fromdb---源數據庫名稱,todb---目標數據庫名稱,fromhost---源數據庫服務器地址
db.createCollection(name,{size:3333,capped:333,max:88888})  建立一個數據集,至關於一個表
db.currentOp()                 取消當前庫的當前操做
db.dropDataBase()              刪除當前數據庫
db.eval(func,args)             run code server-side
db.getCollection(cname)        取得一個數據集合,同用法:db['cname'] or
db.getCollenctionNames()       取得全部數據集合的名稱列表
db.getLastError()              返回最後一個錯誤的提示消息
db.getLastErrorObj()           返回最後一個錯誤的對象
db.getMongo()                  取得當前服務器的鏈接對象get the server
db.getMondo().setSlaveOk()     allow this connection to read from then nonmaster membr of a replica pair
db.getName()                   返回當操做數據庫的名稱
db.getPrevError()              返回上一個錯誤對象
db.getProfilingLevel()         
db.getReplicationInfo()        得到重複的數據
db.getSisterDB(name)           get the db at the same server as this onew
db.killOp()                    中止(殺死)在當前庫的當前操做
db.printCollectionStats()      返回當前庫的數據集狀態
db.printReplicationInfo()
db.printSlaveReplicationInfo()
db.printShardingStatus()       返回當前數據庫是否爲共享數據庫
db.removeUser(username)        刪除用戶
db.repairDatabase()            修復當前數據庫
db.resetError()                
db.runCommand(cmdObj)          run a database command. if cmdObj is a string, turns it into {cmdObj:1}
db.setProfilingLevel(level)    0=off,1=slow,2=all
db.shutdownServer()            關閉當前服務程序
db.version()                   返回當前程序的版本信息


db.test.find({id:10})          返回test數據集ID=10的數據集
db.test.find({id:10}).count()  返回test數據集ID=10的數據總數
db.test.find({id:10}).limit(2) 返回test數據集ID=10的數據集從第二條開始的數據集
db.test.find({id:10}).skip(8)  返回test數據集ID=10的數據集從0到第八條的數據集
db.test.find({id:10}).limit(2).skip(8)  返回test數據集ID=1=的數據集從第二條到第八條的數據
db.test.find({id:10}).sort()   返回test數據集ID=10的排序數據集
db.test.findOne([query])       返回符合條件的一條數據
db.test.getDB()                返回此數據集所屬的數據庫名稱
db.test.getIndexes()           返回些數據集的索引信息
db.test.group({key:...,initial:...,reduce:...[,cond:...]})
db.test.mapReduce(mayFunction,reduceFunction,<optional params>)
db.test.remove(query)                      在數據集中刪除一條數據
db.test.renameCollection(newName)          重命名些數據集名稱
db.test.save(obj)                          往數據集中插入一條數據
db.test.stats()                            返回此數據集的狀態
db.test.storageSize()                      返回此數據集的存儲大小
db.test.totalIndexSize()                   返回此數據集的索引文件大小
db.test.totalSize()                        返回些數據集的總大小
db.test.update(query,object[,upsert_bool]) 在此數據集中更新一條數據
db.test.validate()                         驗證此數據集
db.test.getShardVersion()                  返回數據集共享版本號

3.5 作成windows服務

mongod.exe --bind_ip 127.0.0.1 --logpath "d:\data\dbConf\mongodb.log" --logappend --dbpath "d:\data\db" --port 27017 --serviceName "myFirst" --serviceDisplayName "myFirst" --install

4、批處理程序開啓MongoDB

寫批處理程序是爲了解決每次啓動MongoDB都得敲doc命令

@echo

@pause

mongod -repair -dbpath "d:\data\db"

mongod -dbpath "d:\data\db"

@pause

把它複製到記事本,保存爲.bat文件,而後和mongod.exe放在同一個目錄,之後運行它就能夠啓動MongoDB服務器了。

PS:「mongod -repair -dbpath "E:\mongodbfiles"」是爲了解決啓動時有時會報錯

5、可視化客戶端工具

  用客戶端工具是爲了解決每次都敲命令的問題,這裏推薦兩種工具Robomongo、MongoVUE

 

 

 

6、C#中使用MongoDB

 MongoDB.Driver.dll:顧名思義,驅動程序

 MongoDB.Bson.dll:序列化、Json相關

MongoDB幫助類代碼

/*******************************************************
 * 
 * 做者:徐文東
 * 建立日期:20170510
 * 說明:MongoDb幫助類
 * 運行環境:.NET 4.0
 * 版本號:1.0.0
 * 
 * 歷史記錄:
 * 建立文件 徐文東 20170510 11:56
 * 
*******************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Core.Servers;
using System.Linq.Expressions;

namespace DBI.SaaS.ExternalService.BigData
{
    /// <summary>
    /// MongoDb幫助類
    /// </summary>
    public class DB
    {
        private static readonly string connStr = "mongodb://127.0.0.1:27017";//GlobalConfig.Settings["mongoConnStr"];

        private static readonly string dbName = "xuwendong";//GlobalConfig.Settings["mongoDbName"];

        private static IMongoDatabase db = null;

        private static readonly object lockHelper = new object();

        private DB() { }

        public static IMongoDatabase GetDb()
        {
            if (db == null)
            {
                lock (lockHelper)
                {
                    if (db == null)
                    {
                        var client = new MongoClient(connStr);
                        db = client.GetDatabase(dbName);
                    }
                }
            }
            return db;
        }
    }

    public class MongoDbHelper<T> where T : BaseEntity
    {
        private IMongoDatabase db = null;

        private IMongoCollection<T> collection = null;

        public MongoDbHelper()
        {
            this.db = DB.GetDb();
            collection = db.GetCollection<T>(typeof(T).Name);
        }
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public T Insert(T entity)
        {
            var flag = ObjectId.GenerateNewId();
            entity.GetType().GetProperty("Id").SetValue(entity, flag);
            entity.State = "y";
            entity.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            entity.UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            collection.InsertOneAsync(entity);
            return entity;
        }
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="id"></param>
        /// <param name="field"></param>
        /// <param name="value"></param>
        public void Modify(string id, string field, string value)
        {
            var filter = Builders<T>.Filter.Eq("Id", ObjectId.Parse(id));
            var updated = Builders<T>.Update.Set(field, value);
            UpdateResult result = collection.UpdateOneAsync(filter, updated).Result;
        }
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="entity"></param>
        public void Update(T entity)
        {
            try
            {
                var old = collection.Find(e => e.Id.Equals(entity.Id)).ToList().FirstOrDefault();

                foreach (var prop in entity.GetType().GetProperties())
                {
                    var newValue = prop.GetValue(entity);
                    var oldValue = old.GetType().GetProperty(prop.Name).GetValue(old);
                    if (newValue != null)
                    {
                        if (oldValue == null)
                            oldValue = "";
                        if (!newValue.ToString().Equals(oldValue.ToString()))
                        {
                            old.GetType().GetProperty(prop.Name).SetValue(old, newValue.ToString());
                        }
                    }
                }
                old.State = "n";
                old.UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                var filter = Builders<T>.Filter.Eq("Id", entity.Id);
                ReplaceOneResult result = collection.ReplaceOneAsync(filter, old).Result;
            }
            catch (Exception ex)
            {
                var aaa = ex.Message + ex.StackTrace;
                throw;
            }
        }
        /// <summary>
        /// 刪除
        /// </summary>
        /// <param name="entity"></param>
        public void Delete(T entity)
        {
            var filter = Builders<T>.Filter.Eq("Id", entity.Id);
            collection.DeleteOneAsync(filter);
        }
        /// <summary>
        /// 根據id查詢一條數據
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public T QueryOne(string id)
        {
            return collection.Find(a => a.Id == ObjectId.Parse(id)).ToList().FirstOrDefault();
        }
        /// <summary>
        /// 查詢全部數據
        /// </summary>
        /// <returns></returns>
        public List<T> QueryAll()
        {
            return collection.Find(a => a.State != "").ToList();
        }
        /// <summary>
        /// 根據條件查詢一條數據
        /// </summary>
        /// <param name="express"></param>
        /// <returns></returns>
        public T QueryByFirst(Expression<Func<T,bool>> express)
        {
            return collection.Find(express).ToList().FirstOrDefault();
        }
        /// <summary>
        /// 批量添加
        /// </summary>
        /// <param name="list"></param>
        public void InsertBatch(List<T> list)
        {
            collection.InsertManyAsync(list);
        }
        /// <summary>
        /// 根據Id批量刪除
        /// </summary>
        public void DeleteBatch(List<ObjectId> list)
        {
            var filter = Builders<T>.Filter.In("Id", list);
            collection.DeleteManyAsync(filter);
        }

        /// <summary>
        /// 未添加到索引的數據
        /// </summary>
        /// <returns></returns>
        public List<T> QueryToLucene()
        {
            return collection.Find(a => a.State.Equals("y")|| a.State.Equals("n")).ToList();
        }
    }
    public class mongoCustomer : BaseEntity
    {
        /// <summary>
        /// 購方名稱
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 納稅人識別號
        /// </summary>
        public string TaxCode { get; set; }
        /// <summary>
        /// 地址電話
        /// </summary>
        public string AddressPhone { get; set; }
        /// <summary>
        /// 開戶行及帳號
        /// </summary>
        public string BankAccount { get; set; }
    }
    public abstract class BaseEntity
    {
        public ObjectId Id { get; set; }

        public string State { get; set; }

        public string CreateTime { get; set; }

        public string UpdateTime { get; set; }
    }
}

 

7、參考資料

windows平臺下安裝MongoDB:http://www.runoob.com/mongodb/mongodb-window-install.html

相關文章
相關標籤/搜索