1. 程式人生 > 其它 >mongoDB分散式儲存(一)

mongoDB分散式儲存(一)

1. mongoDB功能介紹

1.1 核心特性

  • 文件資料庫,基於二進位制json儲存文件
  • 高效能、高可用、直接加機器就可以解決擴充套件性問題
  • 支援豐富的CRUD操作,例如聚合統計、全文檢索、座標檢索

1.2 文件資料庫

存放的是json格式的資料,任何欄位都不需要提前定義

{
  name:"pp",
  age:23,
  status:"working",
  groups:["news","sports"]            
}

 

2. mongoDB架構 

 

 

儲存引擎是資料庫和硬體之間的介面,它負責處理用什麼資料結構儲存資料,以及如何寫入、刪除和讀取資料。不同的工作負載型別對於讀寫效能的需求不同,例如新聞網站需要大量的讀,而社交類網站需要大量的寫。MongoDB 3.0開始,提供了可插拔的儲存引擎API,使得使用者可以在MongoDB和第三方提供的多種儲存引擎之間切換。

在一個MongoDB複製集中,多種儲存引擎可以並存,可以滿足應用更復雜的需求。例如,使用In-memory儲存引擎進行低延時的操作,同時使用基於磁碟的儲存引擎完成持久化。

目前MongoDB預設使用的是WiredTiger儲存引擎,WiredTiger是SleepyCat提供的一款開源資料引擎。通過使用現代程式設計技術,如Hazard指標和Lock-free演算法,WiredTiger實現了多核可擴充套件性。

 

3. mongoDB簡單用法示例

  • 列舉資料庫:show databases
  • 選擇資料庫:use my_db1  --資料庫無需建立,只是一個名稱空間
  • 列舉資料表:show collectons
  • 建立資料表:db.createCollection("my_collection")  --資料表schema free,無需定義欄位
  • 插入document:db.my_collection.insertOne({uid:10000,name:"xiaoming",likes:["football","game"]})  --任意巢狀層級的json,文件ID自動生成,無需指定
  • 查詢document:db.my_collection.find({likes:'football',name:{$in:['xiaoming','libai']}}).sort({uid:1})  --基於任意json層級過濾
  • 更新document:db.my_collection.updateMany({likes:'football'},{$set:{name:'libai'}})  --第一個引數是過濾條件,第二個引數是更新操作
  • 刪除document:db.my_collection.deleteMany({name:'xiaoming'})  --引數是過濾條件
  • 建立index:db.my_collection.createIndex({uid:1, name:-1})  --可以指定建立索引時的正反順序,影響排序效率

所有操作示例見官方文件:https://docs.mongodb.com/manual/crud/

 

 

4. mongoDB單機安裝

 推薦使用docker安裝單機mongoDB,主要是方便...docker search mongo #搜尋mongo映象,如果沒有特殊需求建議選擇官方版

#搜尋mongo映象,如果沒有特殊需求建議選擇官方版
docker search mongo 

#不加tag預設拉取最新映象 docker pull mongo
#檢視映象是否拉取成功 docker images
#暴露27017埠,連線客戶端,同時可以
-v 選擇掛載volume docker run -itd --name mongo -p 27017:27017 mongo
#檢視mongo服務是否已經啟動 docker
ps
#進入mongo容器 docker exec
-it mongo mongo admin
#新增admin使用者,密碼123456 db.createUser({ user:
'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
#admin使用者登入mongo db.auth(
'admin','123456')

 

5. 客戶端連線mongoDB

首先需要install客戶端

go get go.mongodb.org/mongo-driver/mongo

 

go-mongo詳細的api文件可以看官網文件,有很詳細的example

https://pkg.go.dev/go.mongodb.org/[email protected]/mongo#pkg-overview

 

func main() {
    // 建立連線 5s超時
    client, err := mongo.Connect(context.TODO(),
        options.Client().ApplyURI("mongodb://xxx.xxx.xxx.xxx:27017"),
        options.Client().SetConnectTimeout(time.Second*5))
    if err != nil {
        fmt.Println(err)
        return
    }

    // 選擇資料庫
    database := client.Database("my_db")

    // 選擇表
    collection := database.Collection("my_collection")
    collection = collection
}