MongoDB
MongoDB는 C++로 작성된 오픈소스 문서지향(Document-Oriented) 적 Cross-platform 데이터베이스이며, 뛰어난 확장성과 성능을 가지고 있다.
Go용 MongoDB 드라이버
Go 에서 Mongodb 용 라이브러리는 몇개 정도 지원 되는것으로 보인다. 그중에 mongo-go-driver 공식 Go 드라이버를 기준으로 작성 하였습니다.
Install
go get go.mongodb.org/mongo-driver/mongo
import & Create client
import시 주소에 주의해야한다. 일부 문서에는 이전 github 주소로 되어 있는 경우가 있다.
import "go.mongodb.org/mongo-driver/mongo"
import "go.mongodb.org/mongo-driver/mongo/options"
client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
MongoDB Connect
MongoDB 연결시 일정시간이 지나면 연결 종료 신호를 보낼수 있도록 context.WithTimOut 함수를 이용하여 타임아웃 시간을 지정한후 연결한다. 연결 체크는 Ping 함수를 통해서할수 있다.
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = client.Connect(ctx)
err = client.Ping(ctx,readpref.Primary()) // Primary DB에 대한 연결 체크
if err != nil {
log.Fatal(err)
}
Database & Collection 가저오기
아래 예제는 test Database 에서 trainers collection 을 가지고 오는 예제이다. 만약 해당 데이터베이스나 collection 이 없는 경우 새롭게 생성된다.
collection := client.Database("test").Collection("trainers")
Insert
trainers collection에 단일 Document를 추가하는 예제로 결과 값으로는 objectID 를 반환한다 .
//입력할 데이터
ash := Trainer{"Ash", 10, "Pallet Town"}
misty := Trainer{"Misty", 10, "Cerulean City"}
brock := Trainer{"Brock", 15, "Pewter City"}
//1개의 Document 추가하기
insertResult, err := collection.InsertOne(context.TODO(), ash)
if err != nil {
log.Fatal(err)
}
참고로 context.TODO 는 해당 nil을 대신하여 넘기는 값으로 취소 되거나 중지 되는 조건이 없는 경우 넣는다.
Insert Many
동시에 어려개의 slice 데이터를 넣는 예제로 반환값은 여러개의 Object ID slice 값을 반환한다.
trainers := []interface{}{misty, brock}
insertManyResult, err := collection.InsertMany(context.TODO(), trainers)
if err != nil {
log.Fatal(err)
}
Udate
collection 에 데이터를 데이터를 업데이트 하는 경우 사용하는 방법
filter := bson.D{{"name", "Ash"}}
update := bson.D{
{"$inc", bson.D{
{"age", 1},
}},
}
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
Delete
status 가 D인 한개의 문서를 삭제하는 예제
result, err := coll.DeleteOne(
context.Background(),
bson.D{
{"status", "D"},
},
)
설정된 조건 없이 collection 의 Document 를 삭제하는 예제
result, err := coll.DeleteMany(context.Background(), bson.D{})
Find
collection에서 한개의 Document를 찾는 예제
var result Trainer
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
collection에서 여러개의 문서를 찾는 예제 SetLimit 함수는 결과값을 제한하는 용도로 사용된다. curser 에서 Decode 로 값을 변환할 수 없는경우 err 을 반환한다.
findOptions := options.Find()
findOptions.SetLimit(2)
var results []*Trainer
cur, err := collection.Find(context.TODO(),bson.D{{}} ,findOptions)
if err != nil {
log.Fatal(err)
}
log.Println("completed find")
for cur.Next(context.TODO()){
var elem Trainer
err := cur.Decode(&elem)
fmt.Printf(" document: %+v\n", elem)
if err != nil {
log.Fatal(err)
}
results = append(results,&elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}