์ฟผ๋ฆฌ ์ง์
์ด ํ์ด์ง์ ๋ด์ฉ
๊ฐ์
์ด ๊ฐ์ด๋์์๋ ๋ฌธ์์ ํ์ ์งํฉ๊ณผ ์ผ์นํ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
๋ฌธ์์ ํ์ ์งํฉ์ ์ผ์น์ํค๋ ค๋ฉด ์ผ์น ์กฐ๊ฑด์ด ํฌํจ๋ ์ฟผ๋ฆฌ ํํฐ๋ฅผ ์ง์ ํฉ๋๋ค. ์ผ์น ์กฐ๊ฑด์ ๋ฌธ์์ ํ์ํ๋ ค๋ ํ๋์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฟผ๋ฆฌ ํํฐ์๋ ๊ฒฐ๊ณผ ์งํฉ์ ํฌํจํ ๋ฌธ์๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ๋ ์ด์์ ์ผ์น ์กฐ๊ฑด ์งํฉ์ด ํฌํจ๋์ด ์์ต๋๋ค.
์ฟผ๋ฆฌ ํํฐ์์ ๋ฆฌํฐ๋ด ๊ฐ ๋๋ ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋๋ฅผ ์ผ์น์ํฌ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ์ ๋๋ ๋ ผ๋ฆฌ์ ์์ ์ ์ํํ์ฌ ์ปฌ๋ ์ ๋ด์์ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฆฌํฐ๋ด ๊ฐ์ด ์๋ ์ผ์น ์กฐ๊ฑด์ ๋ค์ ํ์์ ์ฌ์ฉํฉ๋๋ค.
filter := bson.D{{"<field>", "<value>"}}
์ฟผ๋ฆฌ ์ฐ์ฐ์๊ฐ ์๋ ์ผ์น ์กฐ๊ฑด์ ๋ค์ ํ์์ ์ฌ์ฉํฉ๋๋ค.
filter := bson.D{{"<field>", bson.D{{"<operator>", "<value>"}}}}
๋ค์ ์น์
์์๋ Find()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ ํ์ ์งํฉ์ ์ผ์น์ํค๊ธฐ ์ํด ๋ฆฌํฐ๋ด ๊ฐ๊ณผ ์ฟผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ํ ๋ฐ์ดํฐ
์ด ์น์
์ ์์์์๋ ๋ค์ Tea
๊ตฌ์กฐ์ฒด๋ฅผ tea
์ปฌ๋ ์
์ ์๋ ๋ฌธ์์ ๋ชจ๋ธ๋ก ์ฌ์ฉํฉ๋๋ค.
type Tea struct { Type string Rating int32 Vendor []string `bson:"vendor,omitempty" json:"vendor,omitempty"` }
omitempty
struct ํ๊ทธ๋ ๋น์ด ์์ ๋ ์ฝ์
๋ ๋ฌธ์์์ ํด๋น ํ๋๋ฅผ ์๋ตํฉ๋๋ค.
์ด ๊ฐ์ด๋์ ์์๋ฅผ ์คํํ๋ ค๋ฉด ๋ค์ ์ค๋ํซ์ ์ฌ์ฉํ์ฌ ์ํ ๋ฐ์ดํฐ๋ฅผ db
๋ฐ์ดํฐ๋ฒ ์ด์ค์ tea
์ปฌ๋ ์
์ ๋ก๋ํฉ๋๋ค.
coll := client.Database("db").Collection("tea") docs := []interface{}{ Tea{Type: "Masala", Rating: 10, Vendor: []string{"A", "C"}}, Tea{Type: "English Breakfast", Rating: 6}, Tea{Type: "Oolong", Rating: 7, Vendor: []string{"C"}}, Tea{Type: "Assam", Rating: 5}, Tea{Type: "Earl Grey", Rating: 8, Vendor: []string{"A", "B"}}, } result, err := coll.InsertMany(context.TODO(), docs)
ํ
์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ collection
์ฐ๊ธฐ ์์ ์ ์ํํ ๋ ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ collection์ด ์๋ ๊ฒฝ์ฐ ์๋ฒ๋ ์ด๋ฅผ ์์์ ์ผ๋ก ์์ฑํฉ๋๋ค.
๊ฐ ๋ฌธ์์๋ ์ฐจ ์ข
๋ฅ, ๋ฑ๊ธ, ํด๋น ํ์ข
์ ํ๋งคํ๋ ๊ณต๊ธ์
์ฒด๊ฐ ์ค๋ช
๋์ด ์์ต๋๋ค. ์ด๋ฌํ ํญ๋ชฉ์ type
, rating
๋ฐ vendor
ํ๋์ ํด๋นํฉ๋๋ค.
๋ฆฌํฐ๋ด ๊ฐ
๋ฆฌํฐ๋ด ๊ฐ ์ฟผ๋ฆฌ ํํฐ๋ ์ผ์น ๊ธฐ์ค๊ณผ ์ ํํ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
ํ
๋น ์ฟผ๋ฆฌ ํํฐ๋ฅผ ์ง์ ํ๋ฉด CRUD ์์ ์ ์ปฌ๋ ์ ์ ๋ชจ๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค.
์์
๋ค์ ์๋ type
์ด 'Oolong'์ธ ๋ฌธ์๋ฅผ ์ผ์น์ํต๋๋ค.
filter := bson.D{{"type", "Oolong"}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"Oolong","rating":7,"vendor":["C"]}
ํ
๋ฆฌํฐ๋ด ๊ฐ ์ฟผ๋ฆฌ๋ $eq
๋น๊ต ์ฐ์ฐ์์ ๋์ผํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฟผ๋ฆฌ ํํฐ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
filter := bson.D{{"type", "Oolong"}}
filter := bson.D{{"type", bson.D{{"$eq", "Oolong"}}}}
๋น๊ต
๋น๊ต ์ฐ์ฐ์๋ ์ผ์น ๊ธฐ์ค์ ์ง์ ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ ๊ฐ์ ๋ถ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋น๊ต ์ฐ์ฐ์๋ก๋ '๋ณด๋ค ํฐ(greater than)' ๋น๊ต๋ฅผ ์ํ $gt
, '๋ณด๋ค ์์(less than)' ๋น๊ต๋ฅผ ์ํ $lte
, '๊ฐ์ง ์์(not equal to)' ๋น๊ต๋ฅผ ์ํ $ne
๋ฑ์ด ์์ต๋๋ค.
์์
๋ค์ ์๋ rating
์ด 7
๋ณด๋ค ์์ ๋ฌธ์๋ฅผ ์ผ์น์ํต๋๋ค.
filter := bson.D{{"rating", bson.D{{"$lt", 7}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"English Breakfast","rating":6} {"type":"Assam","rating":5}
๋น๊ต ์ฐ์ฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ๋น๊ต ์ฟผ๋ฆฌ ์ฐ์ฐ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ ผ๋ฆฌ
๋
ผ๋ฆฌ ์ฐ์ฐ์์๋ ์ต์ ๋ ๊ฐ์ ์ผ์น ์กฐ๊ฑด์ด ํ์ํฉ๋๋ค. ๋ฌธ์๊ฐ ์ง์ ๋ ๊ธฐ์ค์ ๋ชจ๋ ์ถฉ์กฑํ๋์ง, ํ๋๋ง ์ถฉ์กฑํ๋์ง ๋๋ ์ ํ ์ถฉ์กฑํ์ง ์๋์ง ํ์ธํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋
ผ๋ฆฌ ์ฐ์ฐ์๋ก๋ ๋ชจ๋ ์ผ์น ๊ธฐ์ค์ด ์ฐธ์ด์ด์ผ ํ๋ $and
, ์ผ์น ๊ธฐ์ค ์ค ํ๋ ์ด์์ด ์ฐธ์ด์ด์ผ ํ๋ $or
๋ฑ์ด ์์ต๋๋ค.
์์
๋ค์ ์๋ rating
์ด 7
๋ณด๋ค ํฌ๊ณ 10
๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ฌธ์๋ฅผ ์ผ์น์ํต๋๋ค.
filter := bson.D{ {"$and", bson.A{ bson.D{{"rating", bson.D{{"$gt", 7}}}}, bson.D{{"rating", bson.D{{"$lte", 10}}}}, }, }, } cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"Masala","rating":10,"vendor":["A","C"]} {"type":"Earl Grey","rating":8,"vendor":["A","B"]}
๋ ผ๋ฆฌ ์ฐ์ฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ๋ ผ๋ฆฌ ์ฟผ๋ฆฌ ์ฐ์ฐ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ
๋ฆฌํฐ๋ด ์ฟผ๋ฆฌ ๋ด $eq
๋น๊ต ์ฐ์ฐ์์ ์ ์ฌํ ์ฌ๋ฌ ์ผ์น ๊ธฐ์ค์ $and
๋
ผ๋ฆฌ ์ฐ์ฐ์์ ๋์ผํ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฟผ๋ฆฌ ํํฐ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค:
filter := bson.D{{"type", "Oolong"}, {"rating", 7}}
filter := bson.D{ {"$and", bson.A{ bson.D{{"type", "Oolong"}}, bson.D{{"rating", 7}}, }}, }
์์
์์ ์ฐ์ฐ์๋ ์ง์ ๋ ํ๋์ ์กด์ฌ ์ฌ๋ถ ๋๋ ์ ํ์ ํ์ธํฉ๋๋ค.
์์
๋ค์์ vendor
ํ๋๊ฐ ์กด์ฌํ์ง ์๋ ๋ฌธ์์ ์ผ์นํ๋ ์์
๋๋ค.
filter := bson.D{{"vendor", bson.D{{"$exists", false}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"English Breakfast","rating":6} {"type":"Assam","rating":5}
์์ ์ฐ์ฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ์์ ์ฟผ๋ฆฌ ์ฐ์ฐ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ๊ฐ
ํ๊ฐ ์ฐ์ฐ์๋ ์ผ์น ๊ธฐ์ค์ ์ง์ ๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์์ ๊ฐ์ ๋ถ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ํ๊ฐ ์ฐ์ฐ์์๋ ํ๋ ๊ฐ์ด ์ง์ ๋ ์ ๊ท ํํ์๊ณผ ์ผ์นํด์ผ ํ๋ $regex
, ํ๋ ๊ฐ์ ์ง์ ๋ ๋ฌธ์์ด์ด ํฌํจ๋์ด์ผ ํ๋ $text
๋ฑ์ด ์์ต๋๋ค.
์์
๋ค์ ์๋ type
์ด ๋ฌธ์ 'E'๋ก ์์ํ๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค.
filter := bson.D{{"type", bson.D{{"$regex", "^E"}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"English Breakfast","rating":6} {"type":"Earl Grey","rating":8,"vendor":["A","B"]}
ํ๊ฐ ์ฐ์ฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ํ๊ฐ ์ฟผ๋ฆฌ ์ฐ์ฐ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฐฐ์ด
๋ฐฐ์ด ์ฐ์ฐ์๋ ๋ฐฐ์ด ํ๋์ ์๋ ์์์ ๊ฐ์ด๋ ์์ ํ์ธํฉ๋๋ค.
์์
๋ค์ ์๋ vendor
์ 'C'๊ฐ ํฌํจ๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค:
filter := bson.D{{"vendor", bson.D{{"$all", bson.A{"C"}}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"Masala","rating":10,"vendor":["A","C"]} {"type":"Oolong","rating":7,"vendor":["C"]}
๋ฐฐ์ด ์ฐ์ฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ๋ฐฐ์ด ์ฟผ๋ฆฌ ์ฐ์ฐ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
๋นํธ ๋จ์
๋นํธ ์ฐ์ฐ์๋ ์ซ์ ํ๋๋ฅผ ๋ฐ์ด 10์ง์(์ญ์ง๋ฒ)์ธ ์ซ์์์ ํด๋นํ๋ ๋ฐ์ด 2์ง์(์ด์ง๋ฒ)์ธ ์ซ์๋ก ๋ณํํฉ๋๋ค. ๋นํธ ์ฐ์ฐ์๋ ๋ฌธ์์ ๊ฐ์ด ์ฌ์ฉ์์ ๋งค์น ๊ธฐ์ค์ ๊ฐ๊ณผ ๋์ผํ ๋นํธ๋ก ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
์์
๋ค์ ์์๋ rating
์ 6
('00000110')๊ณผ ๋์ผํ ๋นํธ๊ฐ ์ค์ ๋ ๋ฌธ์์ ์ผ์นํฉ๋๋ค.
filter := bson.D{{"rating", bson.D{{"$bitsAllSet", 6}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []Tea if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"type":"English Breakfast","rating":6} {"type":"Oolong","rating":7,"vendor":["C"]}
๋นํธ ๋จ์ ์ฐ์ฐ์์ ์ ์ฒด ๋ชฉ๋ก์ ๋นํธ ๋จ์ ์ฟผ๋ฆฌ ์ฐ์ฐ์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
์ถ๊ฐ ์ ๋ณด
์ง๋ฆฌ ๊ณต๊ฐ์ ์ฟผ๋ฆฌ ์ง์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ง๋ฆฌ๊ณต๊ฐ ๋ฐ์ดํฐ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
API ๋ฌธ์
์ด ๊ฐ์ด๋์์ ์ฌ์ฉ๋๋ ๋ฉ์๋ ๋๋ ์ ํ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๋ค์ API ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.