C# MongoDb基本操作

前言
 
 公司的資料庫,部份資料表過大,造成查詢效能低落。目前考慮要將較大的資料表及較不重要的Log檔,搬到MongoDB上,來解決效能瓶頸。

安裝
    • 資料庫管理工具,用來執行備份、還原。
    • 下載後,將相關exe放到安裝目錄內。
  • Nuget C# MongoDB Driver  : Install-Package mongocsharpdriver -Version 2.11.4

C# 新增、讀取、更新、刪除 (CRUD) 操作
安裝套件
Install-Package mongocsharpdriver -Version 2.11.4

初始化
       private static void Init()
        {
            string connectionString = "mongodb://localhost"; // MongoDB 連線字串
            _mongoClient = new MongoClient(connectionString);// 產生 MongoClient  物件
            _mongoDatabase = _mongoClient.GetDatabase("Demo");// 取得  MongoDatabase 物件
            _mongoCollectionProduct =  _mongoDatabase.GetCollection<Product>("Product"); // 取得 Collection(可以視為資料表)
        }
ps:資料庫及Collection可以不用事先建立,寫入時不存在,會自動建立。

新增
        private static void Insert()
        {
            var products = Product.GetTestData();
            _mongoCollectionProduct.InsertMany(products);//寫入多筆
            var single = Product.GetTestData().First();
            _mongoCollectionProduct.InsertOne(single);//寫入單筆
        }

更新
     
       private static void Update(Product product)
        {
            product.Name = "iPhone 12 X";
            //取得資料後更新
            _mongoCollectionProduct.ReplaceOne(o => o.Id == product.Id, product);
            //直接更新
            _mongoCollectionProduct.UpdateOne(Builders<Product>.Filter.Eq(i =>  i.Name, "iPhone 12 X"),
                                              Builders<Product>.Update.Set(i =>  i.Brand, "Apple v2"));
        }

刪除
        private static void Delete()
        {
            _mongoCollectionProduct.DeleteOne(Builders<Product>.Filter.Eq(i =>  i.Name, "Pixel 3a"));
        }

建立索引
        private static void CreateIndex()
        {
            var notificationLogBuilder = Builders<Product>.IndexKeys;
            //單鍵索引
            var index = new  CreateIndexModel<Product>(notificationLogBuilder.Ascending(x => x.Name));
            _mongoCollectionProduct.Indexes.CreateOne(index);
            //多鍵索引
            var indexMultiple = new  CreateIndexModel<Product>(notificationLogBuilder.Ascending(x =>  x.Name).Descending(o => o.Brand));
            _mongoCollectionProduct.Indexes.CreateOne(indexMultiple);
        }

測試
        static IMongoClient _mongoClient;
        static IMongoDatabase _mongoDatabase;
        static IMongoCollection<Product> _mongoCollectionProduct;
        static void Main(string[] args)
        {
            Init();
            Insert();
            CreateIndex();
            var find = _mongoCollectionProduct.Find(o => o.Name == "iPhone  12").Single();
            Update(find);
            Delete();
        }

備份還原
Backup
  • -h 主機
  • -d 資料庫
  • -o 輸出位置
mongodump -h 127.0.0.1 -d Demo -o D:\Temp\MangodbData\Backup\

Resotre
  • --drop 為先刪除現有資料,再進行還原。
    • 若不下這個參數,會直接用新增方式寫入,若有重複會一直報錯。
mongorestore -h 127.0.0.1 -d Demo D:\Temp\MangodbData\Backup\Demo --drop
  • 可以針對單一資料表(Collection)還原,指定到檔名即可

mongorestore -h 127.0.0.1 -d Demo D:\Temp\MangodbData\Backup\Demo\BARCODES_LOG.bson  --drop

其他
  • C:\Program Files\MongoDB\Server\4.4\bin\mongod.cfg
    • 組態設定,可以修改資料庫儲存的檔案位置

參考

這個網誌中的熱門文章

[TFS] 分支與合併