golang基礎(chǔ)學(xué)習(xí)-MongoDB使用

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
  引入:import "gopkg.in/mgo.v2"

mgo簡(jiǎn)介

3.簡(jiǎn)單使用MongoDB

3.1 數(shù)據(jù)設(shè)計(jì)

3.1.1 數(shù)據(jù)庫設(shè)計(jì):

數(shù)據(jù)庫名:mydb_tutorial
集合名: t_student

數(shù)據(jù)集合:t_student字段說明

字段 類型 說明
name string 姓名
age int 年齡
sid string 學(xué)號(hào)
status int 狀態(tài):1正常,9臀脏,刪除

3.1.2結(jié)構(gòu)體設(shè)計(jì):

type Student struct {
    Name   string  `bson: "name"`
    Age    int     `bson: "age"`
    Sid    string  `bson: "sid"`
    Status int     `bson: "status"`
}

type Per struct {
    Per   []Student
}

mgo簡(jiǎn)介

func Dial(url string) (*Session, error)

官方簡(jiǎn)介:Dial establishes a new session to the cluster identified by the given seed server(s).

3.2 插入數(shù)據(jù)


    mongo, err := mgo.Dial("127.0.0.1") // 建立連接 

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")  //選擇數(shù)據(jù)庫和集合

    //創(chuàng)建數(shù)據(jù)
    data := Student{
        Name:   "seeta",
        Age:    18,
        Sid:    "s20180907",
        Status: 1,
    }

    //插入數(shù)據(jù)
    cErr := client.Insert(&data)

    if cErr != nil {
        return false
    }
    return true

執(zhí)行該段程序揉稚,MongoDB會(huì)出現(xiàn)一條記錄:

465457807-5b9224630c5ac_articlex.png

3.3 查找數(shù)據(jù)

在3.2插入數(shù)據(jù)的基礎(chǔ)上搀玖,我們?cè)俨迦胍粭l數(shù)據(jù):

data := Student{
        Name:   "seeta1",
        Age:    18,
        Sid:    "s20180908",
        Status: 1,
    }

3.3.1 findOne

mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    user := Student{}
//查找sid為 s20180907
    cErr := client.Find(bson.M{"sid": "s20180907"}).One(&user)

    if cErr != nil {
        return false
    }

    fmt.Println(user)

    return true

執(zhí)行該段程序,會(huì)打印查找到的結(jié)果:

{seeta 17 s20180907 1}

3.3.2 findAll

查找status為1的數(shù)據(jù)

mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    //每次最多輸出15條數(shù)據(jù)
    iter := client.Find(bson.M{"status": 1}).Sort("_id").Skip(1).Limit(15).Iter()

    var stu Student
    var users Per
    for iter.Next(&stu) {
        users.Per = append(users.Per, stu)
    }

    if err := iter.Close(); err != nil {
        return false
    }
    fmt.Println(users)
    return true

執(zhí)行該段程序,會(huì)打印查找到的結(jié)果:

{[{seeta1 18 s20180908 1} {seeta 18 s20180907 1}]}

3.4 更新數(shù)據(jù)

更新數(shù)據(jù)前:


932441320-5b922958e2d74_articlex.png
    mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    //只更新一條
    cErr := client.Update(bson.M{"status": 1}, bson.M{"$set": bson.M{"age": 20}})
    
    if cErr != nil {

        return false
    }

    return true
}

執(zhí)行命令后:

1224083132-5b92299e696a6_articlex.png

只更新了一條數(shù)據(jù)的年齡

如果我們想把所有status為1的學(xué)生年齡都更新為20.

用client.UpdateAll 替換client.Update 就可以了

3.5 刪除數(shù)據(jù)

刪除數(shù)據(jù):sid為s20180907

    mongo, err := mgo.Dial("192.168.0.91")

    defer mongo.Close()

    if err != nil {
        return false
    }

    client := mongo.DB("mydb_tutorial").C("t_student")

    //只更新一條
    cErr := client.Remove(bson.M{"sid": "s20180907"})

    if cErr != nil {

        return false
    }

    return true

如果數(shù)據(jù)庫設(shè)計(jì)的時(shí)候,有兩個(gè)sid為s20180907 只會(huì)刪除一條記錄侥涵。
如果刪除所有:用client.RemoveAll 替換client.Remove

4. 其他

寫了一個(gè)gin和mgo結(jié)合的數(shù)據(jù)查詢服務(wù)demo,細(xì)節(jié)可點(diǎn)擊鏈接到github查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芜飘,一起剝皮案震驚了整個(gè)濱河市磨总,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娶牌,老刑警劉巖馆纳,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲁驶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡径荔,警方通過查閱死者的電腦和手機(jī)脆霎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門绪穆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱岂,“玉大人菠红,你說我怎么就攤上這事试溯〗季疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵摹闽,是天一觀的道長(zhǎng)付鹿。 經(jīng)常有香客問我蚜迅,道長(zhǎng),這世上最難降的妖魔是什么坐梯? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任吵血,我火速辦了婚禮偷溺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晕翠。我一直安慰自己砍濒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布樊卓。 她就那樣靜靜地躺著碌尔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柳洋。 梳的紋絲不亂的頭發(fā)上叹坦,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天募书,我揣著相機(jī)與錄音,去河邊找鬼莹捡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛齿椅,可吹牛的內(nèi)容都是我干的荷逞。 我是一名探鬼主播种远,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼妙同!你這毒婦竟也來了膝迎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卖漫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旱幼,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年突委,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柏卤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬三。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缘缚,靈堂內(nèi)的尸體忽然破棺而出勾笆,到底是詐尸還是另有隱情,我是刑警寧澤忙灼,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布匠襟,位于F島的核電站钝侠,受9級(jí)特大地震影響该园,放射性物質(zhì)發(fā)生泄漏帅韧。R本人自食惡果不足惜里初,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忽舟。 院中可真熱鬧双妨,春花似錦、人聲如沸叮阅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浩姥。三九已至挑随,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勒叠,已是汗流浹背兜挨。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眯分,地道東北人拌汇。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弊决,于是被迫代替她去往敵國和親噪舀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容