mongodb官方的golang驅(qū)動基礎使用

導入

go get github.com/mongodb/mongo-go-driver/mongo

struct里面獲取ObjectID 點擊這里

鏈接mongo服務

    want, err := readpref.New(readpref.SecondaryMode) //表示只使用輔助節(jié)點
    if err != nil {
        checkErr(err)
    }
    wc := writeconcern.New(writeconcern.WMajority())
    readconcern.Majority()
    //鏈接mongo服務
    opt := options.Client().ApplyURI(url)
    opt.SetLocalThreshold(3 * time.Second)     //只使用與mongo操作耗時小于3秒的
    opt.SetMaxConnIdleTime(5 * time.Second)    //指定連接可以保持空閑的最大毫秒數(shù)
    opt.SetMaxPoolSize(200)                    //使用最大的連接數(shù)
    opt.SetReadPreference(want)                //表示只使用輔助節(jié)點
    opt.SetReadConcern(readconcern.Majority()) //指定查詢應返回實例的最新數(shù)據(jù)確認為宵睦,已寫入副本集中的大多數(shù)成員
    opt.SetWriteConcern(wc)                    //請求確認寫操作傳播到大多數(shù)mongod實例
    if client, err = mongo.Connect(getContext(), opt); err != nil {
        checkErr(err)
    }

判斷服務是否可用

    if err = client.Ping(getContext(), readpref.Primary()); err != nil {
        checkErr(err)
    }

選擇數(shù)據(jù)庫和集合

    collection = client.Database("testing_base").Collection("howie")

刪除這個集合

    collection.Drop(getContext())

設置集合內(nèi)數(shù)據(jù)過期時間

    k := mongo.IndexModel{
        Keys:    bsonx.Doc{{"expiredtime", bsonx.Int32(1)}},
        Options: options.Index().SetExpireAfterSeconds(1 * 60),//60秒后過期哼勇,詳細請查詢完整的代碼演示
    }
    _, err = collection.Indexes().CreateOne(getContext(), k)

插入一條數(shù)據(jù)

    if insertOneRes, err = collection.InsertOne(getContext(), howieArray[0]); err != nil {
        checkErr(err)
    }
    fmt.Printf("InsertOne插入的消息ID:%v\n", insertOneRes.InsertedID)

批量插入數(shù)據(jù)

    if insertManyRes, err = collection.InsertMany(getContext(), howieArray); err != nil {
        checkErr(err)
    }
    fmt.Printf("InsertMany插入的消息ID:%v\n", insertManyRes.InsertedIDs)

查詢單條數(shù)據(jù)

    if err = collection.FindOne(getContext(), bson.D{{"name", "howie_2"}, {"age", 11}}).Decode(&howie); err != nil {
        checkErr(err)
    }
    fmt.Printf("FindOne查詢到的數(shù)據(jù):%v\n", howie)

查詢單條數(shù)據(jù)后刪除該數(shù)據(jù)

    if err = collection.FindOneAndDelete(getContext(), bson.D{{"name", "howie_3"}}).Decode(&howie); err != nil {
        checkErr(err)
    }
    fmt.Printf("FindOneAndDelete查詢到的數(shù)據(jù):%v\n", howie)

詢單條數(shù)據(jù)后修改該數(shù)據(jù)

    if err = collection.FindOneAndUpdate(getContext(), bson.D{{"name", "howie_4"}}, bson.M{"$set": bson.M{"name": "這條數(shù)據(jù)我需要修改了"}}).Decode(&howie); err != nil {
        checkErr(err)
    }
    fmt.Printf("FindOneAndUpdate查詢到的數(shù)據(jù):%v\n", howie)

查詢單條數(shù)據(jù)后替換該數(shù)據(jù)(以前的數(shù)據(jù)全部清空)

    if err = collection.FindOneAndReplace(getContext(), bson.D{{"name", "howie_5"}}, bson.M{"hero": "這條數(shù)據(jù)我替換了"}).Decode(&howie); err != nil {
        checkErr(err)
    }
    fmt.Printf("FindOneAndReplace查詢到的數(shù)據(jù):%v\n", howie)

一次查詢多條數(shù)據(jù)(查詢createtime>=3,限制取2條,createtime從大到小排序的數(shù)據(jù))

    if cursor, err = collection.Find(getContext(), bson.M{"createtime": bson.M{"$gte": 2}}, options.Find().SetLimit(2), options.Find().SetSort(bson.M{"createtime": -1})); err != nil {
        checkErr(err)
    }
    if err = cursor.Err(); err != nil {
        checkErr(err)
    }
    defer cursor.Close(context.Background())
    for cursor.Next(context.Background()) {
        if err = cursor.Decode(&howie); err != nil {
            checkErr(err)
        }
        howieArrayEmpty = append(howieArrayEmpty, howie)
    }
    fmt.Printf("Find查詢到的數(shù)據(jù):%v\n", howieArrayEmpty)

查詢集合里面有多少數(shù)據(jù)

    if size, err = collection.Count(getContext(), nil); err != nil {
        checkErr(err)
    }
    fmt.Printf("Count里面有多少條數(shù)據(jù):%d\n", size)

查詢集合里面有多少數(shù)據(jù)(查詢createtime>=3的數(shù)據(jù))

    if size, err = collection.Count(getContext(), bson.M{"createtime": bson.M{"$gte": 3}}); err != nil {
        checkErr(err)
    }
    fmt.Printf("Count里面有多少條數(shù)據(jù):%d\n", size)

修改一條數(shù)據(jù)

    if updateRes, err = collection.UpdateOne(getContext(), bson.M{"name": "howie_2"}, bson.M{"$set": bson.M{"name": "我要改了他的名字"}}); err != nil {
        checkErr(err)
    }
    fmt.Printf("UpdateOne的數(shù)據(jù):%d\n", updateRes)

修改多條數(shù)據(jù)

    if updateRes, err = collection.UpdateMany(getContext(), bson.M{"createtime": bson.M{"$gte": 3}}, bson.M{"$set": bson.M{"name": "我要批量改了他的名字"}}); err != nil {
        checkErr(err)
    }
    fmt.Printf("UpdateMany的數(shù)據(jù):%d\n", updateRes)

刪除一條數(shù)據(jù)

    if delRes, err = collection.DeleteOne(getContext(), bson.M{"name": "howie_1"}); err != nil {
        checkErr(err)
    }
    fmt.Printf("DeleteOne刪除了多少條數(shù)據(jù):%d\n", delRes.DeletedCount)

刪除多條數(shù)據(jù)

    if delRes, err = collection.DeleteMany(getContext(), bson.M{"createtime": bson.M{"$gte": 7}}); err != nil {
        checkErr(err)
    }
    fmt.Printf("DeleteMany刪除了多少條數(shù)據(jù):%d\n", delRes.DeletedCount)

事務相關

//不能在單節(jié)點使用(副本集可以)
func UseSession(client *mongo.Client) {
    client.UseSession(getContext(), func(sctx mongo.SessionContext) error {
        err := sctx.StartTransaction(options.Transaction().
            SetReadConcern(readconcern.Snapshot()).
            SetWriteConcern(writeconcern.New(writeconcern.WMajority())),
        )
        if err != nil {
            return err
        }
        _, err = client.Database("aa").Collection("bb").InsertOne(sctx, bson.D{{"aa", 3}})
        if err != nil {
            _ = sctx.AbortTransaction(sctx)
            return err
        }
        _, err = client.Database("aa").Collection("bb").InsertOne(sctx, bson.D{{"bb", 3}})
        if err != nil {
            _ = sctx.AbortTransaction(sctx)
            return err
        }
        for {
            err = sctx.CommitTransaction(sctx)
            switch e := err.(type) {
            case nil:
                return nil
            case mongo.CommandError:
                if e.HasErrorLabel("UnknownTransactionCommitResult") {
                    continue
                }
                return e
            default:
                return e
            }
        }
    })
}

完整演示代碼 點擊這里

查看mongo BSON詳細用法 點擊這里

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末执庐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丛塌,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔚晨,居然都是意外死亡,警方通過查閱死者的電腦和手機妻献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來团赁,“玉大人育拨,你說我怎么就攤上這事』渡悖” “怎么了熬丧?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怀挠。 經(jīng)常有香客問我析蝴,道長,這世上最難降的妖魔是什么绿淋? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任闷畸,我火速辦了婚禮,結果婚禮上吞滞,老公的妹妹穿的比我還像新娘佑菩。我一直安慰自己,他們只是感情好裁赠,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布殿漠。 她就那樣靜靜地躺著,像睡著了一般佩捞。 火紅的嫁衣襯著肌膚如雪绞幌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天一忱,我揣著相機與錄音莲蜘,去河邊找鬼谭确。 笑死,一個胖子當著我的面吹牛菇夸,可吹牛的內(nèi)容都是我干的琼富。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼庄新,長吁一口氣:“原來是場噩夢啊……” “哼鞠眉!你這毒婦竟也來了?” 一聲冷哼從身側響起择诈,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤械蹋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羞芍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哗戈,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年荷科,在試婚紗的時候發(fā)現(xiàn)自己被綠了唯咬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡畏浆,死狀恐怖胆胰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刻获,我是刑警寧澤蜀涨,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蝎毡,受9級特大地震影響厚柳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沐兵,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一别垮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扎谎,春花似錦宰闰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至老充,卻和暖如春葡盗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工觅够, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胶背,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓喘先,卻偏偏與公主長得像钳吟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窘拯,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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