์ฟผ๋ฆฌ ์ฐ์ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ํ ๋ฒ์ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค. ๋น๊ต์ฐ์ฐ์๋ฅผ ํน์ ํ์ง ์์ผ๋ฉด $eq
๊ฐ ๊ธฐ๋ณธ ์ฐ์ฐ์๋ก ์ฌ์ฉ๋๋ค.
{ <field> : { <operator> : <value> } }
operator | ์ค๋ช |
---|---|
$eq | = , ์ฃผ์ด์ง ๊ฐ๊ณผ ์ผ์นํ๋ ๊ฐ (equal to) |
$ne | โ , ์ฃผ์ด์ง ๊ฐ๊ณผ ์ผ์นํ์ง ์๋ ๊ฐ (not equal to) |
$gt | > , ์ฃผ์ด์ง ๊ฐ๋ณด๋ค ํฐ ๊ฐ (greater than) |
$lt | < , ์ฃผ์ด์ง ๊ฐ๋ณด๋ค ์์ ๊ฐ (less than) |
$gte | โฅ , ์ฃผ์ด์ง ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ (greater than or equal to) |
$lte | โค , ์ฃผ์ด์ง ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ (less than or equal to) |
studentList๋ผ๋ ์ปฌ๋ ์ ์ ํ์๋ค์ ์ ์(score)๊ฐ ๊ธฐ๋ก๋์ด ์๋ค๊ณ ํ์.
db.studentList.find({ "score" : { "$gte" : 80 } })
db.studentList.find({ "score" : { "$gte" : 80 }, "quiz" : { "$ne" : "fail" } })
db.studentList.find({ "score" : { "$gte" : 80 }, "quiz" : { "$eq" : "pass" } })
db.studentList.find({ "score" : { "$gte" : 80 }, "quiz" : "pass" }) // ์์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์
์ํฉ์ ๋ฐ๋ผ ์์ ๊ฐ์ด,
$eq
๋ฅผ ์๋ตํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
๋
ผ๋ฆฌ์ฐ์ฐ์๋ฅผ ํตํด ๋ฐ์ดํฐ ๊ฒ์์ ์ธ๋ถํ ํ ์ ์๋ค. ์ฐ์ฐ์๊ฐ ์ง์ ๋์ด ์์ง ์์ผ๋ฉด $and
๋ฅผ ๊ธฐ๋ณธ ์ฐ์ฐ์๋ก ์ฌ์ฉํ๋ค. $and
์ ๊ฒฝ์ฐ, ๋์ผํ ์ฐ์ฐ์๋ฅผ ๋ ๋ฒ ์ด์ ํฌํจํ ๊ฒฝ์ฐ์ ๋ช
์ํ๋ค.
- $and, $or, $nor
{ <operator> : [ { <satement_1> }, { <satement_2> }, ... ] }
- $not : ๋ค์ ์ฟผ๋ฆฌ์ ์ ๋ถ์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด ๊ตฌ๋ฌธ์ด ํ์ ์๋ค.
{ "$not" : { <single_satement> } }
operator | ์ค๋ช |
---|---|
$and | ์ฃผ์ด์ง ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ ๋ง์กฑํ๋ ๋ํ๋จผํธ ๋ฐํ |
$or | ์ฃผ์ด์ง ์ฟผ๋ฆฌ์ ์ค ํ๋๋ผ๋ ์ผ์นํ๋ ๋ํ๋จผํธ ๋ฐํ |
$nor | ์ฃผ์ด์ง ๋ชจ๋ ์ฟผ๋ฆฌ์ ๊ณผ ์ผ์นํ์ง ์๋ ๋ํ๋จผํธ ๋ฐํ |
$not | $nor์ ๋จ์ผ๋ฒ์ , ๋ค์ ์ฟผ๋ฆฌ์ ๊ณผ ์ผ์นํ์ง ์๋ ๋ํ๋จผํธ ๋ฐํ |
์ด๋ฒ์๋ airplaneRoute์ปฌ๋ ์ ์์ ํญ๊ณต๊ถ์ ๋ํ ์ ๋ณด๊ฐ ๊ธฐ๋ก๋์ด ์๋ค๊ณ ํ์.
db.airplaneRoute.find({ "total_time" : {"$gt" : 6}, "total_time" : {"$lt" : 20} })
db.airplaneRoute.find({ "$and" : [ { "total_time" : {"$gt" : 6} }, { "total_time" : {"$lt" : 20} } ] })
$and
๊ฐ ๊ธฐ๋ณธ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์, ์์ ๋ ๋ฐฉ๋ฒ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์ฌ์ค ์์ ๋ ๋ฌธ๋ฒ์ ๊ฐ๋ค. ์ด๋ฅผ ํตํด $and
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟผ๋ฆฌ์ ํจ์ถ๋์ด ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ผ ์ธ์ $and
๋ฅผ ๋ช
์ํ ๊น? ์ฟผ๋ฆฌ์ ๋์ผํ ์ฐ์ฐ์๋ฅผ ๋ ๋ฒ ์ด์ ํฌํจํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
db.airplaneRoute.find({ "$and" : [ {"$or" : [{"Departure" : "ICN"}, {"Departure" : "GMP"}]}, {"$or" : [{"Date" : "April 29, 2022"}, {"Date" : "April 31, 2022"}]} ] })
์ด๋ ๊ฒ ๋ ๊ฐ์
$or
์กฐ๊ฑด์ ํฌํจํด์ผ ํ ๋,$and
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
ํํ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ฉด ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฒซ ๋ฒ์งธ๋ก, ์ฟผ๋ฆฌ ๋ด์์ ์ง๊ณํํ์(Aggregation Expression)์ ์ฌ์ฉํ ์ ์๋ค. ๋ ๋ฒ์งธ๋ก, ๋ณ์์ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. ๋ง์ง๋ง์ผ๋ก, ๋์ผํ ๋ํ๋จผํธ ๋ด ํ๋๋ฅผ ์๋ก ๋น๊ตํ ์ ์๋ค. $
๋ฅผ ํตํด ํ๋์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
mongodb $expr
์์ ๋ดค๋ ๋ฌธ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ, ์ง๊ณํํ์์์๋ ์ฐ์ฐ์๋ฅผ ๋จผ์ ์์ฑํ๋ฉฐ ๋ค์์ผ๋ก ํ๋-๊ฐ์ ์ ๋๋ค.
{ "$expr" : { <operator> : { <field> : <value> } } }
๊ฐ ์ฌํ๋ง๋ค ์ฃผ๋ฌธ๋(orders)๊ณผ ์ฌ๊ณ ์(stock)์ ๋ํ ์ ๋ณด๊ฐ ์๋ itemList์ปฌ๋ ์ ์ด ์๋ค๊ณ ํ์.
์๋์ ๊ฐ์ด
$
๋ฅผ ํตํด ํ๋์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.db.itemList.find({"$expr" : { "$gt" : ["$orders", "$stock"] } })
db.itemList.find({"$expr" : { "$and" : [{ "$eq" : ["$orders", "$stock"] }, { "$gt" : ["$orders", 100] }] } })
์๋์ ๊ฐ์ด ์กฐ๊ฑด๋ฌธ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
db.itemList.find({"$expr" : { "$gt": [{"$cond": {if: {"$lt": ["$orders", 10]}, then: {"$subtract": ["$price", 2000]}, else: "$orders"}}], "$stock"} })
- $all
{ <array_field> : { "$all" : [<array>] } }
- $size
{ <array_field> : { "$size" : <number> } }
- $elemMatch
{ <array_field> : {"$elementMatch": { <field> : <value> }}}
operator | ์ค๋ช |
---|---|
$all | ์์์ ์๊ด ์์ด ์ง์ ๋ ๋ชจ๋ ์์๊ฐ ํฌํจ๋ ๋ํ๋จผํธ ๋ฐํ |
$size | ์ง์ ๋ ๋ฐฐ์ด ํ๋์ ์ฃผ์ด์ง ๊ธธ์ด๊ฐ ์ ํํ ์ผ์นํ๋ ๋ํ๋จผํธ ๋ฐํ |
$elemMatch | ์กฐ๊ฑด๊ณผ ๋ง๋ ๋ฐฐ์ด ์ ์์๋ฅผ ๊ฐ์ง ๋ํ๋จผํธ ๋ฐํ |
ํธํ ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ hotelList์ปฌ๋ ์ ์ด ์๋ค๊ณ ํ์. ๊ทธ ์์ ํธํ ์์ ์ ๊ณตํ๋ ์๋น์ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด๋ก ๋ด๊ณ ์๋ amenitiesํ๋๊ฐ ์๋ค.
db.hotelList.find({ "amenities" : "wifi" })
์์ ๊ฐ์ด ์์ฑํ๋ฉด ์์์ ๋ฐฐ์ด ์์ ์์ ์ค wifi๊ฐ ํฌํจ๋ ๋ํ๋จผํธ๋ฅผ ์ป์ ์ ์๋ค.
๋ง์ฝ, ๋ฐฐ์ด ์์ ๋ฃ๋๋ค๋ฉดdb.hotelList.find({ "amenities" : ["wifi"] }) // X!
์ถ๊ฐ์ ์ธ ์ฐ์ฐ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ์ ํํ ์ง์ ๋ ์์๋ง(wifi ํ๋๋ง) ์กด์ฌํ๋ ๋ํ๋จผํธ๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
db.hotelList.find({ "amenities" : ["wifi", "towel" ... ] })
db.hotelList.find({ "amenities" : ["towel", "wifi" ... ] })
์์ ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ๋ฐฐ์ด์์ ์์์ ์์๊ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์์์ ์์์ ๊ด๊ณ ์์ด ์์๋ค์ด ํฌํจ๋ ๋ํ๋จผํธ๋ฅผ ์ฐพ๊ธฐ์ํด์
$all
์ ์ฌ์ฉํ๋ค.db.hotelList.find({"amenities" : { "$all" : ["towel", "wifi" ... ]} })
db.hotelList.find({"amenities" : { "$size" : 20, "$all" : ["towel", "wifi" ... ]} })
๋๋ฒ์งธ ์ธ์๋ก projection์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ค. ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฃ์ ์ฟผ๋ฆฌ๋ฅผ ๋ง์กฑํ๋ ๋ํ๋จผํธ๋ฅผ ์ฐพ๊ณ , ๋๋ฒ์งธ ์ธ์๋ก ๋ฃ์ ํน์ ํ๋๋ง ๊ฒฐ๊ณผ๋ก ๋ฐ์์ฌ ์ ์๋ค. ๋ฐ๋ผ์ ๋ํ๋จผํธ์ ๋ฐ์ดํฐ๊ฐ ํฌ๊ณ ๋ณต์กํ๊ฑฐ๋ ์ํ๋ ๊ฒฐ๊ณผ๋ง ์ป๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉํ ๋์๋ 0
๊ณผ 1
์ ์ฌ์ฉํด ๊ฒฐ๊ณผ์์ ํ์ํ๊ฑฐ๋ ํ์ํ์ง ์์ ํ๋๋ฅผ ์ง์ ํ๋ค. 0
์ ์ง์ ํ ํ๋๋ฅผ ์ ์ธ, 1
์ ์ง์ ํ ํ๋๋ฅผ ํฌํจ์ํค๋ฉฐ, 0
๊ณผ 1
์ ํผ์ฉํด์ ์ฌ์ฉํด์๋ ์๋๋ค. ์์ธ์ ์ผ๋ก "_id"
๋ 1
์ด ๋ํดํธ์ด๊ธฐ ๋๋ฌธ์ "_id"
๋ฅผ 0
์ผ๋ก ์ง์ ํ ๋์๋ง ํผ์ฉํด์ ์ฌ์ฉํ ์ ์๋ค.
๋๋ฒ์งธ ์ธ์๋ก projection์ ์ฝ์ ํ๋ค.
db.collection.find({ <query> }, { <projection> })
ํ์๋ค์ ์ด๋ฆ(name), ์ํ์ ์(score), ์์ ์ ์(homework), ์ํํ๊ฐ(performance_grade)์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด studentList๋ก ์์๋ฅผ ๋ค์ด๋ณด์.
db.studentList.find({ "score" : { "$gte" : 80 } })
๊ธฐ์กด์ ์์ ๊ฐ์ด ์กฐํํ๋ค๋ฉด ํด๋น ๋ํ๋จผํธ์ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ด๋ฆ๋ง์ ์ํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ์ ์ ๋ฃ์ด์ฃผ๋ฉด ์ง์ ํ ํน์ ํ๋๋ง ํ์ธํ ์ ์๋ค.
db.studentList.find({ "score" : { "$gte" : 80 } }, { "name" : 1 })
์์ ๊ฒฝ์ฐ ์ด๋ฆ๊ณผ ํจ๊ป "_id"์ ๊ฐ๋ ํ์๋ ๊ฒ์ด๋ค. "_id"์ ๊ฐ์ ๋ํดํธ๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์์ํ๊ฒ ์ด๋ฆ๋ง์ ์ํ๋ค๋ฉด
db.studentList.find({ "score" : { "$gte" : 80 } }, { "name" : 1, "_id" : 0 })
์ด๋ ๊ฒ
"_id" : 0
์ ์ถ๊ฐํ๋ค.
db.studentList.find({ "score" : { "$gte" : 80 } }, { "name" : 1, "homework" : 1 })
์์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
์๋์ ๊ฐ์ด0
๊ณผ1
์ ํผ์ฉํด์ ์ฌ์ฉํด์๋ ์๋๋ค.(๋จ, "_id"๋ ์์ธ)db.studentList.find({ "score" : { "$gte" : 80 } }, { "name" : 1, "homework" : 1, "performance_grade" : 0 })
$elemMatch
๋ ๋ฐฐ์ด์ฐ์ฐ์์ ํ๋ก์ ์
์์ ๋ชจ๋ ์ฐ์ผ ์ ์๋ค. ์ฒซ๋ฒ์งธ์ธ์์ธ find ๋ช
๋ น์ฟผ๋ฆฌ์ ์ฐ์ผ ๊ฒฝ์ฐ, ๋ฐฐ์ด ํ๋์ ์๋ธ ๋ํ๋จผํธ ํ๋ ์ค ์ฟผ๋ฆฌ์ ์ผ์นํ๋ ๋ํ๋จผํธ๋ฅผ ์ฐพ๋๋ค. ๋๋ฒ์งธ ์ธ์๋ก ํ๋ก์ ์
๋ถ๋ถ์ ์ฐ์ผ ๊ฒฝ์ฐ, ์ง์ ๋ ๊ธฐ์ค๊ณผ ์ผ์นํ๋ ์์๊ฐ ํ๋ ์ด์ ์๋ ๋ฐฐ์ด ์์๋ง ๊ฒฐ๊ณผ์ ํฌํจํ๋ค.
- query
db.collection.find({ <field>: { $elemMatch: { <query1>, <query2>, ... } } })
- projection
db.collection.find({ <query> }, { <field>: { $elemMatch: { <query1>, <query2>, ... } } })
์์ธํ ๋ด์ฉ์ ๊ณต์๋ฌธ์๋ฅผ ํ์ธํ์!
mongodb $elemMatch(query)
mongodb $elemMatch(projection)
Dot Notation์ ์ฌ์ฉํด ์๋ธ ๋ํ๋จผํธ๋ฅผ ์์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ๋ฐฐ์ด์์ Dot Notation์ ์ฌ์ฉํ๋ ค๋ฉด ์์์ ์์น๋ฅผ ํน์ ํด์ผ ํ๋ค.
.
์ผ๋ก ์ํ๋ ๋งํผ ์ค์ฒฉ๋ ๋ํ๋จผํธ๋ก ์ด๋ํด ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.db.collection.find({ "<field1>.<other_field>.<also_a_field>" : "value" })
ํ์๋ค์ด ์๊ฐํ๊ณ ์๋ ๋ชจ๋ ๊ณผ๋ชฉ์ ๋ํ ๋ฐฐ์ด์ด ์๊ณ , ๊ทธ ์์ ํด๋น ๊ณผ๋ชฉ์ ๋ํ ์๊ฐ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์ปฌ๋ ์ studentCourses๊ฐ ์๋ค๊ณ ํ์. ๋ํ๋จผํธ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
{ "_id" : 01a, "name" : jabae, "courses" : [{ "Math" : { "teacher" : Sam, "score" : 70, "homwork": pass }, "English" : { "teacher" : Jimmy, "score" : 75, "homwork": fail } }] }
db.studentCourses.find({ "courses.Math.teacher" : "sam" }, {"name" : 1})
์์ ๊ฐ์ด ์ ์ผ๋ก ์ ๊ทผํด ์ฐพ์ ์ ์๋ค.