国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用Go語言借助mgo實現(xiàn)一個對MongoDB進行增刪改查的demo

Jingbin_ / 3661人閱讀

摘要:準備數(shù)據(jù)結(jié)構這個以對一個簡單的通訊錄進行插入查詢更新刪除記錄為例,中包含和兩個字段下載還沒出官方的驅(qū)動包,是現(xiàn)在比較流行的第三方包,能找到的相關資料也比較多。準備實現(xiàn)對的增刪改查操作,先想了下怎么寫測試案例。查找,通過查找該條記錄。

環(huán)境聲明:
go version go1.11
MongoDB server version 4.0.3
背景

這是我第一次接觸golang和MongoDB,正在在參照他們的官方手冊學習。想試著用“測試驅(qū)動開發(fā)”(TDD)的模式來做這個demo。

寫這個demo的目的是為了讓自己開始寫一些golang的代碼,和練習一下MongoDB簡單的CRUD操作。

準備 數(shù)據(jù)結(jié)構

這個demo以對一個簡單的通訊錄進行插入、查詢、更新、刪除記錄為例,collection中包含name和phone兩個字段:

{ name : "Jack_Green", phone : "9987650" }
下載mgo

MongoDB還沒出官方的golang驅(qū)動包,mgo是現(xiàn)在比較流行的第三方包,能找到的相關資料也比較多。

go get gopkg.in/mgo.v2
開始

參照MongoDB官方手冊在本地搭了一套環(huán)境,練習了在mongo shell中使用命令的CRUD操作,熟悉了一下這個數(shù)據(jù)庫。

準備實現(xiàn)對MongoDB的增、刪、改、查操作,先想了下怎么寫測試案例。測試用了比較簡單的方法來實現(xiàn),而且沒有考慮可能出現(xiàn)的全部情況,而是只寫了各個操作的某一種情況。

編寫測試案例
文件名 gomd_test.go

可以自定義不同的db、collection名稱,且測試時方便使對象統(tǒng)一修改,聲明兩個struct:

type Person struct {
    Name  string
    Phone string
}
type Collection struct {
    DB string 
    Name string
}

在測試代碼文件中聲明兩個變量:

var col = Collection{"testDB", "contacts"}
var p = Person{"Jack_Green", "9987650"}

“C” 插入,測試插入方法,往通訊錄中添加記錄。不過要首先確保查詢方法是可用的,我自己剛開始寫的時候是先實現(xiàn)了查詢方法,在插入之后,用查詢方法把數(shù)據(jù)取出來打印。

// C create/insert
func TestInsert(t *testing.T) {
    insert(p, col)
    pb := findByName(p.Name, col)
    if pb.Name != p.Name || pb.Phone != p.Phone {
        t.Error("insert failed")
    }
    fmt.Println("Insert Result")
    fmt.Println(pb)
}

“R” 查找,通過name查找該條記錄。

// R read/find
func TestFindByName(t *testing.T) {
    p := findByName(p.Name, col)
    if p.Name == "" || p.Phone == "" {
        t.Error("find by name test failed")
    }
    fmt.Println("Find Result")
    fmt.Println(p)
}

“U” 更新,修改通訊錄中某位的手機號,根據(jù)name修改phone

// U update
func TestUpdate(t *testing.T) {
    p := Person{"WEW", "121212122"}
    update(p, col)
    ub := findByName(p.Name, col)
    fmt.Println("Update Result")
    fmt.Println(ub)
}

“D” 刪除,根據(jù)name刪除已存在的某條記錄

// D delete
func TestDeleteData(t *testing.T) {
    deleteData(p, col)
}
golang代碼實現(xiàn)對MongoDB的CRUD
文件名 godm.go

剛剛開始寫golang,對于創(chuàng)建session這部分有很多的冗余,等對它和mgo有了更深的了解之后,再來優(yōu)化下。

導入必要的包

import (
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "log"
)

數(shù)據(jù)庫地址

const (
    URL = "127.0.0.1:27017"
)

往通訊錄中添加一條記錄

func insert(p Person, col Collection) {
    session, err := mgo.Dial(URL)
    if err != nil {
        panic(err)
    }
    defer session.Close()
    c := session.DB(col.DB).C(col.Name)
    err = c.Insert(p)
    if err != nil {
        log.Fatal(err)
    }
}

根據(jù)姓名從通訊錄中查找聯(lián)系方式

func findByName(name string, col Collection) Person {
    session, err := mgo.Dial(URL)
    if err != nil {
        panic(err)
    }
    defer session.Close()
    session.SetMode(mgo.Monotonic, true)
    collection := session.DB(col.DB).C(col.Name)
    result := Person{}
    err = collection.Find(bson.M{"name": name}).One(&result)
    if err != nil {
        log.Fatal(err)
    }
    return result
}

更新通訊錄中某人的聯(lián)系方式

func update(p Person, col Collection) {
    session, err := mgo.Dial(URL)
    if err != nil {
        panic(err)
    }
    defer session.Close()
    collection := session.DB(col.DB).C(col.Name)
    err = collection.Update(bson.M{"name": p.Name}, bson.M{"$set": bson.M{"phone": p.Phone}})
    if err != nil {
        log.Fatal(err)
    }
}

將某人的信息從通訊錄中刪除

func deleteData(p Person, col Collection) {
    session, err := mgo.Dial(URL)
    if err != nil {
        panic(err)
    }
    defer session.Close()
    collection := session.DB(col.DB).C(col.Name)
    err = collection.Remove(bson.M{"name": p.Name})
}
測試結(jié)果

運行:

go test -v

輸出:

=== RUN   TestInsert
Insert Result
{Jack_Green 9987650}
--- PASS: TestInsert (0.03s)
=== RUN   TestFindByName
Find Result
{Jack_Green 9987650}
--- PASS: TestFindByName (0.01s)
=== RUN   TestUpdate
Update Result
{Jack_Green 121212122}
--- PASS: TestUpdate (0.02s)
=== RUN   TestDeleteData
--- PASS: TestDeleteData (0.01s)
PASS
ok      gomd    0.240s
附錄 完整代碼

Golang operation MongoDB demo : gomd

參考資料

Golang連接MongoDB數(shù)據(jù)庫

How To Build Microservice With MongoDB In Golang

godoc : labix mgo v2

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19408.html

相關文章

  • Go與MongoDB

    摘要:沒有類這一概念,對于變量的捆綁都是由鍵值對形式的結(jié)構體實現(xiàn)的。在做記錄的查詢時,需要新建一個同類型的結(jié)構體或結(jié)構體數(shù)組,然后執(zhí)行操作,如果參數(shù)為空,則返回全部記錄如果你熟悉的操作,可以看出,這樣的操作與直接在內(nèi)操作幾乎相同。 go沒有類這一概念,對于變量的捆綁都是由鍵值對形式的結(jié)構體(struct)實現(xiàn)的。這對同樣是以鍵值對形式存儲的mongodb以及json都非常友好。所以在go中,...

    Baaaan 評論0 收藏0
  • mongo的findAndModify原子性操作實現(xiàn)auto increment ID

    摘要:實際情況默認情況下,使用自動生成,而且在自帶的命令里,無法指定一個自增字段。自增字段在多線程時必須是原子性的,這在大數(shù)據(jù)情況下很難實現(xiàn)伸縮性。而且,在里面,有一個命令是原子性的。代碼如下無法打開創(chuàng)建個模擬多線程環(huán)境輸出查詢結(jié)果 實際情況 默認情況下,mongo使用_id自動生成uniq id,而且在mongo自帶的命令里,無法指定一個自增字段。自增字段在多線程時必須是原子性的,這在大數(shù)...

    genedna 評論0 收藏0
  • golang基礎學習-MongoDB使

    摘要:如果刪除所有用替換其他寫了一個和結(jié)合的數(shù)據(jù)查詢服務細節(jié)可點擊鏈接到查看 1.系統(tǒng)環(huán)境 Golang:go version go1.10.3 darwin/amd64 OS:MacOS MongoDB: version: 3.4.4 2.Golang使用MongoDB 使用:gopkg.in/mgo.v2 獲取包:go get gopkg.in/mgo.v2 引入:impor...

    LinkedME2016 評論0 收藏0
  • 使express+mongoosemongodb實現(xiàn)刪改查操作

    摘要:項目地址寫在開頭本文主要分享我如何使用對實現(xiàn)增刪改查操作,感謝社區(qū)所有精品文章的幫助,以及的開源項目對我的啟發(fā)。我們這個項目是建立一個班級學生管理系統(tǒng),能夠?qū)W生的姓名及學號進行增刪改查的操作。 項目地址:https://github.com/jrainlau/mongoose_cru... 寫在開頭 本文主要分享我如何使用express+mongoose對mongodb實現(xiàn)增刪改查...

    Markxu 評論0 收藏0
  • mongodb操作基本語法(刪改查)

    摘要:啟動啟動服務輸入命令進入操作終端,需要新開窗口基礎語法查看當前所有的數(shù)據(jù)庫查看當前所有的數(shù)據(jù)庫新建數(shù)據(jù)庫創(chuàng)建的數(shù)據(jù)庫這個時候是看不到的,因為數(shù)據(jù)庫里沒有任何東西。查找集合所有信息班創(chuàng)建一個集合,并插入一條數(shù)據(jù),數(shù)據(jù)里是帶有對象的。 1、啟動mongodb mongod -f /usr/local/etc/mongod.conf //啟動服務 mongo //輸入命令進入mongo操作...

    DirtyMind 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<