Go操作MongoDB

ice_moss發表於2022-03-17

前言:我們知道資料庫是用來儲存我們的資料的,但是資料庫同樣需要我們來管理,這裡我們來介紹一下如何使用Go語言來對MongoDB進行操作

一、Go連線MongoDB埠

首先我們需要讓go連線MongoDB埠,我們可以這樣做:

Database

這是我的檔案目錄結構

在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")]}

開啟資料庫我們可以看到:

Database

接下來再來寫一個查詢資料庫的函式:

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)
    }
}

這裡我們還是來了解一下對應的方法:

  1. 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{})來包含所有文件。
  2. cur.Next(c)

    函式宣告:

    func (*mongo.Cursor).Next(ctx context.Context) bool
    Next 獲取此遊標的下一個文件。 如果沒有錯誤並且遊標沒有耗盡,則返回 true。
    
    Next 阻塞,直到文件可用、發生錯誤或 ctx 過期。 如果 ctx 過期,錯誤將被設定為 ctx.Err()。 在錯誤情況下,Next 將返回 false。
    
    如果 Next 返回 false,則後續呼叫也將返回 false
  3. 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 協議》,轉載必須註明作者和本文連結

相關文章