이 장에서는 Golang MongoDB 문서 쿼리의 사용법을 소개합니다.

선행 자습서

팁: MongoDB 쿼리 구문에 익숙하지 않다면 먼저 MongoDB 자습서를 읽어보세요. Golang에서 사용하는 MongoDB 작업의 표현 구문은 동일합니다.

테스트 데이터 준비

coll 컬렉션에 일괄 문서 데이터를 삽입합니다.

docs := []interface{}{
    bson.D{
        {"item", "journal"},
        {"qty", 25},
        {"size", bson.D{
            {"h", 14},
            {"w", 21},
            {"uom", "cm"},
        }},
        {"status", "A"},
    },
    // ... (다른 문서 데이터)
}

결과, 오류 := coll.InsertMany(context.Background(), docs)

모든 문서 쿼리

cursor, err := coll.Find(
    context.Background(),
    bson.D{}, // 빈 쿼리 조건 설정
)

동등 쿼리 조건

SQL의 동등 매치와 유사합니다.

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", "D"}},   // 동등 조건: status = D
)

in 쿼리 연산자

SQL의 in 쿼리와 유사합니다.

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // 동등 조건: status in ('A', 'D')

and 쿼리 조건

SQL의 and 논리식과 유사합니다.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // 동등 조건: status='A' and qty < 30 
        {"status", "A"},
        {"qty", bson.D{{"$lt", 30}}},
    })

or 쿼리 조건

SQL의 or 논리식과 유사합니다.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // 동등 조건: status = "A" OR qty < 30
        {"$or", // $or 연산자 사용
            bson.A{ // bson.A 배열 유형 정의 사용
                bson.D{{"status", "A"}},
                bson.D{{"qty", bson.D{{"$lt", 30}}}},
            }},
    })

복합 쿼리 예시

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // 동등 조건: status = "A" AND ( qty < 30 OR item LIKE "p%")
        {"status", "A"},
        {"$or", bson.A{
            bson.D{{"qty", bson.D{{"$lt", 30}}}},
            bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
        }},
    })

쿼리 결과 순회

예시 1

// name이 'Bob'인 문서 쿼리
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
	log.Fatal(err)
}

// bson.M 타입의 문서 배열 정의, bson.M은 맵과 비슷한 키-값 데이터 구조를 가진다.
var results []bson.M
// All 함수를 사용하여 모든 쿼리 결과를 검색하고 결과를 results 변수에 저장합니다.
if err = cursor.All(context.TODO(), &results); err != nil {
	log.Fatal(err)
}

// results 배열 순회
for _, result := range results {
	fmt.Println(result)
}

설명: 이 예제는 bson.M 타입을 사용하여 문서 데이터를 저장합니다. 필드가 문서와 일치하면 사용자 정의 구조체 유형을 사용할 수 있습니다.

예시 2:

// 쿼리 결과를 저장할 구조체 유형의 변수 정의
var result struct {
    Value float64
}

// name = 'pi'인 문서 쿼리 조건 정의
filter := bson.D{{"name", "pi"}}
// 콘텍스트 객체 생성 및 쿼리 타임아웃을 5초로 설정
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 조건에 따라 단일 데이터를 쿼리하고 Decode 함수를 사용하여 결과를 result 변수에 저장합니다.
err = collection.FindOne(ctx, filter).Decode(&result)

// 쿼리 오류 확인
if err == mongo.ErrNoDocuments {
    // 문서를 찾을 수 없음
    fmt.Println("문서가 존재하지 않습니다")
} else if err != nil {
    log.Fatal(err)
}
// 다른 처리

팁: 더 정교한 MongoDB 쿼리 표현 구문에 대해서는 MongoDB 자습서를 참조하십시오.