前言:我們知道資料庫是用來儲存我們的資料的,但是資料庫同樣需要我們來管理,這裡我們來介紹一下如何使用Go語言來對MongoDB進行操作
一、Go連線MongoDB埠
首先我們需要讓go連線MongoDB埠,我們可以這樣做:
這是我的檔案目錄結構
在main中:
func main() {
c := context.Background()
//連線MongoDB埠
/*
Connect 建立一個新的客戶端,然後使用 Connect 方法對其進行初始化。 這相當於呼叫 NewClient,然後呼叫 Client.Connect。
*/
mc, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/coolcar"))
if err != nil {
panic(err) //這裡就不具體但進行錯誤處理了
}
//連入MongoDB中的資料庫coolcar中的account
col := mc.Database("coolcar").Collection("account")
這樣我們就成功連線上了MongoDB埠,並且可以對coolcar中的account進行操作了
下面來寫兩個函式來運算元據庫:
//向資料庫寫入資料
func insertRows(c context.Context, col *mongo.Collection) {
res, err := col.InsertMany(c, []interface{}{ //向資料庫中寫入資料
bson.M{
"open_id": "001",
},
bson.M{
"open_id": "002",
},
bson.M{
"open_id": "003",
},
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", res)
}
我們在main()中呼叫:
func main() {
c := context.Background()
//連線MongoDB埠
/*
Connect 建立一個新的客戶端,然後使用 Connect 方法對其進行初始化。 這相當於呼叫 NewClient,然後呼叫 Client.Connect。
*/
mc, err := mongo.Connect(c, options.Client().ApplyURI("mongodb://localhost:27017/coolcar"))
if err != nil {
panic(err) //這裡就不具體但進行錯誤處理了
}
//連入MongoDB中的資料庫coolcar中的account
col := mc.Database("coolcar").Collection("account")
//呼叫函式
insertRows(c, col)
列印結果:(資料就已經寫入資料庫了)
&{InsertedIDs:[ObjectID("6232caa11b0ff048aabc3808") ObjectID("6232caa11b0ff048aabc3809") ObjectID("6232caa11b0ff048aabc380a")]}
開啟資料庫我們可以看到:
接下來再來寫一個查詢資料庫的函式:
func findRows(c context.Context, col *mongo.Collection) {
cur, err := col.Find(c, bson.M{})
if err != nil {
panic(err)
}
for cur.Next(c) {
var row struct {
ID primitive.ObjectID `bson:"_id"`
OpenID string `bson:"open_id"`
}
err = cur.Decode(&row)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", row)
}
}
這裡我們還是來了解一下對應的方法:
col.Find(c, bson.M{})
函式宣告:
func (*mongo.Collection).Find(ctx context.Context, filter interface{}, opts ...*options.FindOptions) (*mongo.Cursor, error)
Find 執行 find 命令並返回集合中匹配文件的 Cursor。 filter 引數必須是包含查詢運算子的文件,並且可用於選擇結果中包含哪些文件。 它不能為零。 應使用空文件(例如 bson.D{})來包含所有文件。
cur.Next(c)
函式宣告:
func (*mongo.Cursor).Next(ctx context.Context) bool
Next 獲取此遊標的下一個文件。 如果沒有錯誤並且遊標沒有耗盡,則返回 true。 Next 阻塞,直到文件可用、發生錯誤或 ctx 過期。 如果 ctx 過期,錯誤將被設定為 ctx.Err()。 在錯誤情況下,Next 將返回 false。 如果 Next 返回 false,則後續呼叫也將返回 false。
cur.Decode(&row)
函式宣告:
func (*mongo.Cursor).Decode(val interface{}) error
Decode 會將當前文件解組為 val 並返回解組過程中的任何錯誤而不進行任何修改。 如果 val 為 nil 或型別為 nil,則會返回錯誤。
呼叫此函式列印結果:
{ID:ObjectID("623186a83dbbceb3de249c40") OpenID:123}
{ID:ObjectID("623186a83dbbceb3de249c41") OpenID:456}
{ID:ObjectID("62319fb5238127d009269726") OpenID:olSZV5QLR587RJZCV8OB-29qdR4Q}
panic: error decoding key _id: an ObjectID string must be exactly 12 bytes long (got 2)
```當然該資料庫中還有其他資料,因為ObjectID的原因,程式panic了```
本作品採用《CC 協議》,轉載必須註明作者和本文連結