mongoDB分散式儲存(一)
阿新 • • 發佈:2022-03-16
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 }