이 장에서는 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 자습서를 참조하십시오.