이 튜토리얼은 Golang 언어 관점에서 MongoDB의 기본 동작을 소개합니다.

참고: 이 튜토리얼은 MongoDB가 제공하는 공식 Go 언어 드라이버 패키지를 사용합니다.

사전 튜토리얼

MongoDB 튜토리얼

참고: MongoDB에 익숙하지 않은 경우 먼저 MongoDB 지식을 습득해 주세요. Golang 튜토리얼에서 관련 지식을 반복하지 않습니다.

기본 요구 사항

  • Go 1.10 이상
  • MongoDB 2.6 이상

종속성 설치

go get go.mongodb.org/mongo-driver/mongo

MongoDB에 연결

import (
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

// MongoDB 연결 주소
uri := "mongodb://localhost:27017"
// 컨텍스트 오브젝트를 가져와서 타임아웃을 설정할 수 있습니다
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// MongoDB에 연결
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))

Connect 함수는 고루틴을 차단하지 않습니다. 즉, Connect 메서드를 호출한 후에 직접적으로 MongoDB를 조작하면 연결에 성공하지 않았을 수도 있습니다. MongoDB가 성공적으로 연결했는지 확인하기 위해 Ping 메서드를 사용할 수 있습니다.

// MongoDB에 핑을 보내 연결에 성공했으면 오류가 반환되지 않습니다
err = client.Ping(ctx, readpref.Primary())

MongoDB 연결 주소

MongoDB 연결 주소에는 서버 주소, 포트 번호, 계정 및 비밀번호와 같은 중요한 정보가 포함됩니다. 형식은 다음과 같습니다.

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

예시:

// 기본 사용자명과 비밀번호로 localhost:27017 주소에 연결
mongodb://localhost:27017

// 계정=root, 비밀번호=123456으로 localhost:27017 주소에 연결하고 기본 데이터베이스=admin에 연결
mongodb://root:123456@localhost:27017/admin

연결 리소스 해제

연결이 더 이상 필요하지 않으면 연결 리소스를 수동으로 해제해야 합니다.

defer func() {
    if err = client.Disconnect(ctx); err != nil {
        panic(err)
    }
}()

컬렉션 인스턴스 가져오기

Golang에서 MongoDB를 조작하려면 먼저 컬렉션 인스턴스를 가져와 CRUD 작업을 수행해야 합니다.

// Database를 통해 데이터베이스 이름을 설정하고 Collection을 통해 컬렉션 이름을 설정합니다.
collection := client.Database("testing").Collection("numbers")

참고: MongoDB의 특성에 따라 미리 데이터베이스 및 컬렉션을 생성할 필요가 없습니다. 데이터가 처음으로 작성될 때 자동으로 생성됩니다.

문서 삽입

InsertOne 함수를 사용하여 데이터를 삽입합니다.

// Context 객체, 요청 시간 초과를 설정하는 데 일반적으로 사용되며, 이전에 만든 context 객체를 재사용할 수 있습니다. 다시 정의할 필요 없음
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 문서 삽입, 여기에서는 JSON 문서를 나타내기 위해 bson.D 유형을 사용합니다. bson.D는 JSON 배열을 나타냅니다.
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})

// 새로 추가된 문서의 ID 가져오기
id := res.InsertedID

다음 패키지를 가져와야 합니다:

import (
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

참고: Golang에서 bson 패키지는 JSON 문서 데이터 구조를 나타내기 위해 사용됩니다. 다음 장에서는 Golang에서 MongoDB 데이터 저장 구조의 표현에 대해 자세히 다룰 것입니다.

package main
import (
	"context"
	"fmt"
	"time"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
)
func main() {
	// MongoDB 연결 주소 설정
	uri := "mongodb://root:123456@localhost:27017/admin"
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	// MongoDB에 연결
	client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
	if err != nil {
		panic(err)
	}

	defer func() {
		// 지연 후에 연결 해제
		if err = client.Disconnect(ctx); err != nil {
			panic(err)
		}
	}()

	// MongoDB 연결이 성공적으로 되었는지 확인
	if err := client.Ping(ctx, readpref.Primary()); err != nil {
		panic(err)
	}
	fmt.Println("MongoDB가 성공적으로 연결되었습니다!")

	// 숫자 컬렉션 가져오기
	collection := client.Database("testing").Collection("numbers")

	// 문서 삽입
	res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
	id := res.InsertedID
	fmt.Println("새로운 문서 ID=", id)
}