使用GO操作MongoDB的方法_第1頁(yè)
使用GO操作MongoDB的方法_第2頁(yè)
使用GO操作MongoDB的方法_第3頁(yè)
使用GO操作MongoDB的方法_第4頁(yè)
使用GO操作MongoDB的方法_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第使用GO操作MongoDB的方法目錄安裝MongoDB驅(qū)動(dòng)程序連接MongoDB列出所有數(shù)據(jù)庫(kù)從MongDB中查詢(xún)數(shù)據(jù)查詢(xún)單個(gè)文檔查詢(xún)多個(gè)文檔更新多個(gè)文檔刪除MongoDB文檔獲取MongoDB服務(wù)狀態(tài)

安裝MongoDB驅(qū)動(dòng)程序

mkdrmongodb

cdmongodb

gomodinit

goget/mongo-driver/mongo

連接MongoDB

創(chuàng)建一個(gè)main.go文件

將以下包導(dǎo)入main.go文件中

packagemain

import(

"context"

"fmt"

"log"

"/mongo-driver/bson"

"/mongo-driver/mongo"

"/mongo-driver/mongo/options"

"time"

)

連接MongoDB的URI格式為

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][options]]

單機(jī)版

mongodb://localhost:27017

副本集

mongodb://:27017,:27017,:27017/replicaSet=myRepl

分片集群

mongodb://:27017,:27017,:27017

mongo.Connect()接受Context和options.ClientOptions對(duì)象,該對(duì)象用于設(shè)置連接字符串和其他驅(qū)動(dòng)程序設(shè)置。

通過(guò)context.TODO()表示不確定現(xiàn)在使用哪種上下文,但是會(huì)在將來(lái)添加一個(gè)使用Ping方法來(lái)檢測(cè)是否已正常連接MongoDB

funcmain(){

clientOptions:=options.Client().ApplyURI("mongodb://admin:password@localhost:27017")

varctx=context.TODO()

//ConnecttoMongoDB

client,err:=mongo.Connect(ctx,clientOptions)

iferr!=nil{

log.Fatal(err)

//Checktheconnection

err=client.Ping(ctx,nil)

iferr!=nil{

log.Fatal(err)

fmt.Println("ConnectedtoMongoDB!")

deferclient.Disconnect(ctx)

列出所有數(shù)據(jù)庫(kù)

databases,err:=client.ListDatabaseNames(ctx,bson.M{})

iferr!=nil{

log.Fatal(err)

fmt.Println(databases)

在GO中使用BSON對(duì)象

MongoDB中的JSON文檔以稱(chēng)為BSON(二進(jìn)制編碼的JSON)的二進(jìn)制表示形式存儲(chǔ)。與其他將JSON數(shù)據(jù)存儲(chǔ)為簡(jiǎn)單字符串和數(shù)字的數(shù)據(jù)庫(kù)不同,BSON編碼擴(kuò)展了JSON表示形式,例如int,long,date,floatpoint和decimal128。這使應(yīng)用程序更容易可靠地處理,排序和比較數(shù)據(jù)。GoDriver有兩種系列用于表示BSON數(shù)據(jù):D系列類(lèi)型和Raw系列類(lèi)型。

D系列包括四種類(lèi)型:

D:BSON文檔。此類(lèi)型應(yīng)用在順序很重要的場(chǎng)景下,例如MongoDB命令。

M:無(wú)序map。除不保留順序外,與D相同。

A:一個(gè)BSON數(shù)組。

E:D中的單個(gè)元素。

插入數(shù)據(jù)到MongoDB

插入單條文檔

//定義插入數(shù)據(jù)的結(jié)構(gòu)體

typesunshareboystruct{

Namestring

Ageint

Citystring

//連接到test庫(kù)的sunshare集合,集合不存在會(huì)自動(dòng)創(chuàng)建

collection:=client.Database("test").Collection("sunshare")

wanger:=sunshareboy{"wanger",24,"北京"}

insertOne,err:=collection.InsertOne(ctx,wanger)

iferr!=nil{

log.Fatal(err)

fmt.Println("InsertedaSingleDocument:",insertOne.InsertedID)

執(zhí)行結(jié)果如下

同時(shí)插入多條文檔

collection:=client.Database("test").Collection("sunshare")

dongdong:=sunshareboy{"張冬冬",29,"成都"}

huazai:=sunshareboy{"華仔",28,"深圳"}

suxin:=sunshareboy{"素心",24,"甘肅"}

god:=sunshareboy{"劉大仙",24,"杭州"}

qiaoke:=sunshareboy{"喬克",29,"重慶"}

jiang:=sunshareboy{"姜總",24,"上海"}

//插入多條數(shù)據(jù)要用到切片

boys:=[]interface{}{dongdong,huazai,suxin,god,qiaoke,jiang}

insertMany,err:=collection.InsertMany(ctx,boys)

iferr!=nil{

log.Fatal(err)

fmt.Println("Insertedmultipledocuments:",insertMany.InsertedIDs)

從MongDB中查詢(xún)數(shù)據(jù)

查詢(xún)單個(gè)文檔

查詢(xún)單個(gè)文檔使用collection.FindOne()函數(shù),需要一個(gè)filter文檔和一個(gè)可以將結(jié)果解碼為其值的指針

varresultsunshareboy

filter:=bson.D{{"name","wanger"}}

err=collection.FindOne(context.TODO(),filter).Decode(result)

iferr!=nil{

log.Fatal(err)

fmt.Printf("Foundasingledocument:%+v\n",result)

返回結(jié)果如下

ConnectedtoMongoDB!

Foundasingledocument:{Name:wangerAge:24City:北京}

ConnectiontoMongoDBclosed.

查詢(xún)多個(gè)文檔

查詢(xún)多個(gè)文檔使用collection.Find()函數(shù),這個(gè)函數(shù)會(huì)返回一個(gè)游標(biāo),可以通過(guò)他來(lái)迭代并解碼文檔,當(dāng)?shù)瓿珊螅P(guān)閉游標(biāo)

Find函數(shù)執(zhí)行find命令并在集合中的匹配文檔上返回Cursor。

filter參數(shù)必須是包含查詢(xún)運(yùn)算符的文檔,并且可以用于選擇結(jié)果中包括哪些文檔。不能為零??瘴臋n(例如bson.D{})應(yīng)用于包含所有文檔。

opts參數(shù)可用于指定操作的選項(xiàng),例如我們可以設(shè)置只返回五條文檔的限制(//mongo-driver/mongo/options#Find)。

//定義返回文檔數(shù)量

findOptions:=options.Find()

findOptions.SetLimit(5)

//定義一個(gè)切片存儲(chǔ)結(jié)果

varresults[]*sunshareboy

//將bson.D{{}}作為一個(gè)filter來(lái)匹配所有文檔

cur,err:=collection.Find(context.TODO(),bson.D{{}},findOptions)

iferr!=nil{

log.Fatal(err)

//查找多個(gè)文檔返回一個(gè)游標(biāo)

//遍歷游標(biāo)一次解碼一個(gè)游標(biāo)

forcur.Next(context.TODO()){

//定義一個(gè)文檔,將單個(gè)文檔解碼為result

varresultsunshareboy

err:=cur.Decode(result)

iferr!=nil{

log.Fatal(err)

results=append(results,result)

fmt.Println(result)

iferr:=cur.Err();err!=nil{

log.Fatal(err)

//遍歷結(jié)束后關(guān)閉游標(biāo)

cur.Close(context.TODO())

fmt.Printf("Foundmultipledocuments(arrayofpointers):%+v\n",results)

返回結(jié)果如下

ConnectedtoMongoDB!

{wanger24北京}

{張冬冬29成都}

{華仔28深圳}

{素心24甘肅}

{劉大仙24杭州}

Foundmultipledocuments(arrayofpointers):[0xc0002664500xc0002665100xc0002665700xc0002665d00xc000266630]

ConnectiontoMongoDBclosed.

更新MongoDB文檔

更新單個(gè)文檔

更新單個(gè)文檔使用collection.UpdateOne()函數(shù),需要一個(gè)filter來(lái)匹配數(shù)據(jù)庫(kù)中的文檔,還需要使用一個(gè)update文檔來(lái)更新操作

filter參數(shù)必須是包含查詢(xún)運(yùn)算符的文檔,并且可以用于選擇要更新的文檔。不能為零。如果過(guò)濾器不匹配任何文檔,則操作將成功,并且將返回MatchCount為0的UpdateResult。如果過(guò)濾器匹配多個(gè)文檔,將從匹配的集合中選擇一個(gè),并且MatchedCount等于1。

update參數(shù)必須是包含更新運(yùn)算符的文檔(/manual/reference/operator/update/),并且可以用于指定要對(duì)所選文檔進(jìn)行的修改。它不能為nil或?yàn)榭铡?/p>

opts參數(shù)可用于指定操作的選項(xiàng)。

filter:=bson.D{{"name","張冬冬"}}

//如果過(guò)濾的文檔不存在,則插入新的文檔

opts:=options.Update().SetUpsert(true)

update:=bson.D{

{"$set",bson.D{

{"city","北京"}},

result,err:=collection.UpdateOne(context.TODO(),filter,update,opts)

iferr!=nil{

log.Fatal(err)

ifresult.MatchedCount!=0{

fmt.Printf("Matched%vdocumentsandupdated%vdocuments.\n",result.MatchedCount,result.ModifiedCount)

ifresult.UpsertedCount!=0{

fmt.Printf("insertedanewdocumentwithID%v\n",result.UpsertedID)

}

返回結(jié)果如下

ConnectedtoMongoDB!

Matched1documentsandupdated1documents.

ConnectiontoMongoDBclosed.

更新多個(gè)文檔

更新多個(gè)文檔使用collection.UpdateOne()函數(shù),參數(shù)與collection.UpdateOne()函數(shù)相同

filter:=bson.D{{"city","北京"}}

//如果過(guò)濾的文檔不存在,則插入新的文檔

opts:=options.Update().SetUpsert(true)

update:=bson.D{

{"$set",bson.D{

{"city","鐵嶺"}},

result,err:=collection.UpdateMany(context.TODO(),filter,update,opts)

iferr!=nil{

log.Fatal(err)

ifresult.MatchedCount!=0{

fmt.Printf("Matched%vdocumentsandupdated%vdocuments.\n",result.MatchedCount,result.ModifiedCount)

ifresult.UpsertedCount!=0{

fmt.Printf("insertedanewdocumentwithID%v\n",result.UpsertedID)

}

返回結(jié)果如下

ConnectedtoMongoDB!

Matched2documentsandupdated2documents.

ConnectiontoMongoDBclosed.

刪除MongoDB文檔

可以使用collection.DeleteOne()或collection.DeleteMany()刪除文檔。如果你傳遞bson.D{{}}作為過(guò)濾器參數(shù),它將匹配數(shù)據(jù)集中的所有文檔。還可以使用collection.drop()刪除整個(gè)數(shù)據(jù)集。

filter:=bson.D{{"city","鐵嶺"}}

deleteResult,err:=collection.DeleteMany(context.TODO(),filter)

iferr!=nil{

log.Fatal(err)

fmt.Printf("Deleted%vdocumentsinthetrainerscollection\n",deleteResult.DeletedCount)

返回結(jié)果如下

ConnectedtoMongoDB!

Deleted2documentsinthetrainerscolle

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論