




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 杭州中學(xué)分班考數(shù)學(xué)試卷
- 淮安九年級(jí)期末數(shù)學(xué)試卷
- 貴港三模數(shù)學(xué)試卷
- 健康管理師課件講義
- 2025屆河南省洛陽(yáng)市偃師高中物理高一第二學(xué)期期末調(diào)研試題含解析
- 2025-2030年中國(guó)錫鉛焊絲項(xiàng)目投資可行性研究分析報(bào)告
- 健康社區(qū)課件
- 2025年中國(guó)微信營(yíng)銷(xiāo)行業(yè)市場(chǎng)深度調(diào)研分析及投資前景研究預(yù)測(cè)報(bào)告
- 花椒加工廠可行性研究報(bào)告
- 中國(guó)維生素B12行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢(xún)報(bào)告
- 企業(yè)突發(fā)事件應(yīng)急處置工作方案
- 護(hù)理人文關(guān)懷科室匯報(bào)
- DB36-T 2037-2024 地質(zhì)災(zāi)害治理工程施工監(jiān)理規(guī)范
- 《公路建設(shè)項(xiàng)目文件管理規(guī)程》
- 腰麻課件教學(xué)課件
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) 6-30-99-00 工業(yè)機(jī)器人系統(tǒng)操作員 人社廳發(fā)2020108號(hào)
- 2024年《治安管理處罰法》多項(xiàng)選擇題題庫(kù)及答案(共193題)
- 2025屆單一概念材料作文“被討厭的勇氣”審題指導(dǎo)高考語(yǔ)文寫(xiě)作技巧實(shí)戰(zhàn)分析與素材運(yùn)用
- 工程債權(quán)轉(zhuǎn)讓合同模板
- 人教版初三化學(xué)必考知識(shí)點(diǎn)總結(jié)
- 歷史人教部編版八年級(jí)(上冊(cè))第13課五四運(yùn)動(dòng)課件(23張)2024版新教材
評(píng)論
0/150
提交評(píng)論