> # MongoDB
- 概念
- 數據庫
- 集合
- 文檔
~~~
package main
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
// 設置 MongoDB 連接選項
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
// 檢查連接是否正常
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
// 選擇要操作的數據庫和集合
collection := client.Database("testdb").Collection("testcollection")
/*
// 插入文檔(單個)
insertDoc := bson.D{
{Key: "name", Value: "John"},
{Key: "age", Value: 30},
{Key: "city", Value: "New York"},
}
*/
/*
//插入文檔(多個)
insertDoc := []interface{}{
bson.D{
{Key: "name", Value: "Test1"},
{Key: "age", Value: 30},
},
bson.D{
{Key: "name", Value: "Test2"},
{Key: "age", Value: 25},
},
}
_, err = collection.InsertMany(context.TODO(), insertDoc)
if err != nil {
log.Fatal(err)
}
*/
/*
// 查詢文檔(單個)
var result bson.M
//設置查詢過濾條件
filter := bson.D{{"name", "Test1"}}
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Println("Found document:", result)
*/
/*
// 查詢文檔(多個)
type Person struct {
Name string
Age int
}
// 構建正則表達式來進行模糊搜索
regexPattern := "1.*" // 這里使用 "John" 開頭的字符串作為模糊搜索的示例
// 創建正則表達式
regex := primitive.Regex{Pattern: regexPattern, Options: "i"} // "i" 表示不區分大小寫
// 設置查詢過濾條件(查詢年齡大于等于 >=25 && <= 100 歲 的文檔)
filter := bson.D{
{"name", bson.M{"$regex": regex}}, // 設置查詢條件,使用正則表達式匹配名字字段
{"age", bson.D{{"$gte", 25}, {"$lte", 100}}},
}
// 設置排序條件,按年齡升序排列
options := options.Find()
options.SetSort(bson.D{{"age", 1}}) //1 表示升序,-1 表示降序
// 設置結果數量限制
options.SetLimit(10) // 這里限制結果數量為 10
// 執行查詢
cur, err := collection.Find(context.TODO(), filter, options)
if err != nil {
log.Fatal(err)
}
defer cur.Close(context.TODO())
// 使用切片的指針來存儲查詢結果
var results []Person
// 遍歷查詢結果并解碼
for cur.Next(context.TODO()) {
var result Person
err := cur.Decode(&result)
if err != nil {
log.Fatal(err)
}
results = append(results, result)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
*/
/*
// 更新文檔
filter := bson.D{{"name", "Test1"}}
update := bson.D{
{"$set", bson.D{{"age", 55}}},
}
updateResult, err := collection.UpdateMany(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Matched %v documents and modified %v documents\n", updateResult.MatchedCount, updateResult.ModifiedCount)
*/
// 刪除文檔
filter := bson.D{{"name", "Test1"}}
deleteResult, err := collection.DeleteMany(context.TODO(), filter)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the collection\n", deleteResult.DeletedCount)
// 斷開連接
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)
}
fmt.Println("Connection to MongoDB closed.")
// 等待一段時間以確保連接被關閉(可選)
time.Sleep(2 * time.Second)
}
~~~
MongoDB支持多種索引類型,以滿足不同的查詢和性能需求。以下是一些常見的MongoDB索引類型:
1. **單字段索引(Single Field Index):** 最簡單的索引類型,對單個字段進行索引,可以是升序或降序。
2. **復合索引(Compound Index):** 在多個字段上創建組合索引,可以更好地支持復雜的查詢。復合索引可以包含多個字段,并按照指定的順序創建。
3. **文本索引(Text Index):** 用于支持文本搜索,可以在文本字段上創建,允許全文本搜索和文本分析。
4. **地理空間索引(Geospatial Index):** 用于地理空間數據(如地理坐標),可以用于地理位置查詢和地理位置距離計算。
5. **哈希索引(Hash Index):** 用于散列字段,對字段進行哈希索引,可用于提高散列字段的查詢性能。
6. **唯一索引(Unique Index):** 用于確保集合中的字段具有唯一值,重復值將被拒絕插入。
7. **部分索引(Partial Index):** 僅索引滿足特定條件的文檔,可用于過濾數據。
8. **TTL(Time-To-Live)索引:** 用于自動刪除具有指定過期時間的文檔,可用于實現數據自動清理。
9. **復合文本索引(Compound Text Index):** 用于在多個文本字段上創建組合文本索引,以支持復雜的全文本搜索。
10. **復合地理空間索引(Compound Geospatial Index):** 在多個地理空間字段上創建組合地理空間索引,用于更復雜的地理查詢。
11. **全文本索引(Wildcard Text Index):** 用于全文搜索,通常與文本搜索操作符一起使用。
這些索引類型可以根據您的數據和查詢需求進行組合使用,以提高查詢性能和效率。不同的索引類型適用于不同的用例,因此在設計數據庫模式時需要仔細考慮索引的選擇和使用。
```
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
// 設置MongoDB連接選項
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
// 連接到MongoDB
client, err := mongo.Connect(context.Background(), clientOptions)
if err != nil {
fmt.Println("連接到MongoDB失敗:", err)
return
}
// 選擇要創建索引的集合
collection := client.Database("your_database").Collection("your_collection")
// 定義要在哪些字段上創建索引,示例為單個字段的升序索引
indexModel := mongo.IndexModel{
Keys: bson.M{
"your_field": 1, // 1表示升序,-1表示降序
},
}
// 創建索引
_, err = collection.Indexes().CreateOne(context.Background(), indexModel)
if err != nil {
fmt.Println("創建索引失敗:", err)
return
}
fmt.Println("索引創建成功")
}
```
- 草稿
- Golang
- 切片 slice
- 數組和切片的區別
- 左閉右開
- make([]int, 5) 和 make([]int, 0, 5) 區別
- 切片非線程安全,并發操作為啥不會像map一樣報錯
- []struct{} 如何遍歷
- 切片如何刪除某個元素
- append 一個nil 切片
- 哈希表 map
- 并發操作
- 并發寫報錯
- 并發讀不會報錯
- 并發讀有寫報錯
- 并發迭代有寫報錯
- 自制并發安全字典
- 官方并發安全字典
- 對未初始化的 map 進行賦值操作
- map的底層
- 無序輸出
- 等量擴容
- 實現集合
- map的key可以使哪些值
- 協程 go
- 協程相關閱讀
- 進程、線程、協程
- 協程 (捕獲異常 和 協程池)
- GPM 模型
- CSP模型
- channel
- channel 相關操作
- 交替打印
- 如何讓channel 只能接收/只能發送
- channel 常見報錯
- channel 死鎖
- nil channel 和 已關閉的 channel
- 使用 select 來多路復用 channel
- channel 的使用
- 接口和結構體
- 簡單使用
- 兩個結構體能否比較
- 工廠模式
- 概念
- 簡單工廠
- 方法工廠
- 堆和棧,值類型和引用類型,內存逃逸,垃圾回收
- 棧和堆
- 內存逃逸
- 值類型和引用類型
- 垃圾回收方式
- 性能優化分析工具 pprof
- golang 代碼片段
- 片段一 defer
- 片段二 channel
- Golang 相關
- Golang 相關閱讀
- Golang 1-10
- make 和 new 的區別
- 使用指針的場景
- Go語言的context包
- 位運算
- Copy 是淺拷貝還是深拷貝
- init 函數 和 sync.Once
- select 多路復用
- Golang 其它
- MongoDB
- 可比較類型 與 可轉json 類型
- Gorm
- 面向對象和面向過程
- go語言實現-面向對象
- go語言實現-面向過程
- 限流,熔斷,降級
- 了解
- 熔斷配置
- 熔斷例子
- 服務降級
- github.com/alibaba/sentinel-golang
- 互斥鎖 讀寫鎖 原子鎖
- 為什么需要鎖
- 互斥鎖
- 讀寫鎖
- 原子鎖
- 互斥鎖性能對比
- 原子鎖性能對比
- 互斥鎖 or 原子鎖?
- 條件鎖
- 計數器
- GoFrame
- GF1.16版本
- 修改使用的表
- 按天、周、月、年
- GoFrame 文檔
- 配置文件
- 生成腳本
- 排序算法
- 相關排序
- 冒泡排序
- 選擇排序
- 插入排序
- 快速排序
- 歸并排序
- 堆排序
- 數據庫
- 分布式怎么保證線程安全
- 數據庫實現方式
- 基于表記錄
- 樂觀鎖
- 悲觀鎖
- Redis實現方式
- Zookeeper實現方式
- Mysql 相關
- group_concat
- 索引優化
- 索引優化1
- 定期分析和優化索引
- 覆蓋索引
- 組合索引
- 聚簇索引和非聚簇索引
- 索引類型與方式、聚簇與非聚簇索引
- 事務特征和隔離級別
- 查詢優化
- mysql自增表插入數據時,Id不連續問題
- InnoDB引擎 和 MyISAM引擎區別
- 鎖
- 悲觀鎖和樂觀鎖
- 查詢,更新,插入語句
- 什么是死鎖
- 怎么處理死鎖
- MySQL 隔離級別
- 事務特征
- 隔離級別
- 廢棄3
- 索引
- 索引類型和方式、聚簇和非聚簇索引(上)
- 索引類型和方式、聚簇和非聚簇索引(下)
- 回表、覆蓋索引、最左前綴、聯合索引、索引下推、索引合并
- Mysql 優化
- 索引的原理
- 千萬級表修改表結構
- Redis
- 獲取隨機三條數據
- Redis 持久化方式
- 全量模式 RDB 冷備份(內存快照)
- 增量模式 AOF 熱備份(文件追加)
- 過期key的刪除策略、內存淘汰機制
- 數據結構
- 位圖
- 網絡
- 網絡相關
- 游戲同步方式:幀同步和狀態同步
- Websocket
- OSI模型
- TCP 與 UDP
- 三次握手四次揮手
- Http 狀態碼
- 1xx(信息性狀態碼)
- 101 服務端代碼
- 101 客戶端代碼
- 2xx(成功狀態碼)
- 3xx(重定向狀態碼)
- 302 服務端代碼
- 302 客戶端代碼
- 4xx(客戶端錯誤狀態碼)
- 5xx(服務器錯誤狀態碼)
- 如何排查接口問題
- 網絡請求和響應過程
- time_wait
- keep-alive
- http 和 rpc 的區別
- I/O多路復用 select和poll
- too many open file
- 其它技術
- git 相關操作
- 修改提交備注
- 多個提交合并成一個提交
- 回退版本
- 小程序和公眾號
- 消息模板
- 獲取code
- 靜默登錄
- 其它技術相關
- C盤空間不足
- 生成式人工智能AIGC
- 共享文件
- 接口文檔, mock提供測試數據
- 抓包工具
- Python
- 安裝包失敗
- 自動化測試 Scrapy
- AIGC:人工智能生成內容
- PHP
- xhprof 性能分析
- 一鍵安裝
- 哈希沖突的解決方式
- 鏈地址法(拉鏈法)
- 開放地址法
- 再哈希
- 概念1
- Nginx
- 負載均衡方式
- 加密解密
- 簡單了解
- 簽名算法例子
- 碼例子1
- 代碼例子2
- Linux
- netstat (用于查看和管理網絡連接和路由表)
- ps 用于查看和管理進程
- ab 壓測
- nohup 守護進程
- lsof (List Open File 獲取被進程打開文件的信息)
- tail 查看日志
- 各類linux同步機制
- Socket 服務端的實現,select 和epoll的區別?
- scp 傳輸,awk 是一個強大的文本分析工具
- pidof
- 項目
- 棋牌
- 牌的編碼
- 出牌規則
- 洗牌
- 股票
- 股票知識
- 龍虎榜數據緩存方式
- 單日龍虎榜數據
- 單只股票的歷史上榜
- 遇到的問題
- 浮點數精度問題
- Mysql Sum 精度問題(float, double精度問題)
- 分頁問題(數據重復)
- 工具包
- v3
- common.go
- common_test.go
- customized.go
- customized_test.go
- slice.go
- slice_test.go
- time.go
- time_test.go
- v4
- common.go
- common_test.go
- customized.go
- customized_test.go
- slice.go
- time.go
- time_test.go
- 相關閱讀
- 協程 goroutine
- 通道 channel
- json 和 gob 序列化和反序列化
- redis 有序集合
- mysql22
- 相關閱讀 s
- pyTorch
- defer
- 內存泄漏
- 數據傳輸
- 雜項
- 一提
- gogogoo
- 內容