[TIL : 40] NoSQL : MongoDB_Advanced CRUD

jabaeยท2022๋…„ 4์›” 29์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
40/44

๐Ÿ“Œ ๋น„๊ต์—ฐ์‚ฐ์ž(Comparison Operators)

์ฟผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ •ํ•œ ๋ฒ”์œ„ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋น„๊ต์—ฐ์‚ฐ์ž๋ฅผ ํŠน์ •ํ•˜์ง€ ์•Š์œผ๋ฉด $eq๊ฐ€ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

1. ๋ฌธ๋ฒ•

{ <field> : { <operator> : <value> } }

2. ์—ฐ์‚ฐ์ž : $eq, $ne, $gt, $lt, $gte, $lte

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)

3. ์˜ˆ์‹œ

studentList๋ผ๋Š” ์ปฌ๋ ‰์…˜์— ํ•™์ƒ๋“ค์˜ ์ ์ˆ˜(score)๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

  • ํ•™์ƒ๋“ค ์ค‘ ์ ์ˆ˜๊ฐ€ 80์  ์ด์ƒ์ธ ํ•™์ƒ ์ฐพ์•„๋ณด๊ธฐ
    db.studentList.find({ "score" : { "$gte" : 80 } })
  • ๊ทธ ์ค‘, ํ€ด์ฆˆ์—์„œ "fail"์„ ๋ฐ›์ง€ ์•Š์€ ํ•™์ƒ ์ฐพ์•„๋ณด๊ธฐ
    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๋ฅผ ์ƒ๋žตํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž(Logic Operators)

๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์„ธ๋ถ„ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์‚ฐ์ž๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด $and๋ฅผ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉํ•œ๋‹ค. $and์˜ ๊ฒฝ์šฐ, ๋™์ผํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ํฌํ•จํ•  ๊ฒฝ์šฐ์— ๋ช…์‹œํ•œ๋‹ค.

1. ๋ฌธ๋ฒ•

  • $and, $or, $nor
{ <operator> : [ { <satement_1> }, { <satement_2> }, ... ] }
  • $not : ๋’ค์˜ ์ฟผ๋ฆฌ์ ˆ์„ ๋ถ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ๊ตฌ๋ฌธ์ด ํ•„์š” ์—†๋‹ค.
{ "$not" : { <single_satement> } }

2. ์—ฐ์‚ฐ์ž : $and, $or, $nor, $not

operator์„ค๋ช…
$and์ฃผ์–ด์ง„ ๋ชจ๋“  ์ฟผ๋ฆฌ์ ˆ์„ ๋งŒ์กฑํ•˜๋Š” ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜
$or์ฃผ์–ด์ง„ ์ฟผ๋ฆฌ์ ˆ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋Š” ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜
$nor์ฃผ์–ด์ง„ ๋ชจ๋“  ์ฟผ๋ฆฌ์ ˆ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜
$not$nor์˜ ๋‹จ์ผ๋ฒ„์ „, ๋’ค์˜ ์ฟผ๋ฆฌ์ ˆ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜

3. ์˜ˆ์‹œ

์ด๋ฒˆ์—๋Š” airplaneRoute์ปฌ๋ ‰์…˜์—์„œ ํ•ญ๊ณต๊ถŒ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

  • ๋น„ํ–‰์‹œ๊ฐ„(total_time)์ด 6์‹œ๊ฐ„ ~ 20์‹œ๊ฐ„ ์‚ฌ์ด์˜ ํ•ญ๊ณต๊ถŒ ์ฐพ๊ธฐ
    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๋ฅผ ๋ช…์‹œํ• ๊นŒ? ์ฟผ๋ฆฌ์— ๋™์ผํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ํฌํ•จํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • ํ•œ๊ตญ์—์„œ ์ถœ๋ฐœํ•˜๋ฉด์„œ(ICN, GMP) ์ถœ๋ฐœ ๋‚ ์งœ๊ฐ€ 29, 31์ผ์ธ ํ•ญ๊ณต๊ถŒ ์ฐพ๊ธฐ
    db.airplaneRoute.find({ "$and" : [ {"$or" : [{"Departure" : "ICN"}, {"Departure" : "GMP"}]},
    									{"$or" : [{"Date" : "April 29, 2022"}, {"Date" : "April 31, 2022"}]} ] })

    ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐœ์˜ $or ์กฐ๊ฑด์„ ํฌํ•จํ•ด์•ผ ํ•  ๋•Œ, $and ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Œ ํ‘œํ˜„์—ฐ์‚ฐ์ž(Expressive Query Operator)

$expr

ํ‘œํ˜„์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ, ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์ง‘๊ณ„ํ‘œํ˜„์‹(Aggregation Expression)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ, ๋ณ€์ˆ˜์™€ ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋™์ผํ•œ ๋„ํ๋จผํŠธ ๋‚ด ํ•„๋“œ๋ฅผ ์„œ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค. $๋ฅผ ํ†ตํ•ด ํ•„๋“œ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
mongodb $expr

1. ๋ฌธ๋ฒ•

์•ž์„œ ๋ดค๋˜ ๋ฌธ๋ฒ•๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ง‘๊ณ„ํ‘œํ˜„์‹์—์„œ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋ฉฐ ๋‹ค์Œ์œผ๋กœ ํ•„๋“œ-๊ฐ’์„ ์ ๋Š”๋‹ค.

{ "$expr" : { <operator> : { <field> : <value> } } }

2. ์˜ˆ์‹œ

๊ฐ ์žฌํ’ˆ๋งˆ๋‹ค ์ฃผ๋ฌธ๋Ÿ‰(orders)๊ณผ ์žฌ๊ณ ์ˆ˜(stock)์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š” itemList์ปฌ๋ ‰์…˜์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

  • ์ฃผ๋ฌธ๋Ÿ‰์ด ์žฌ๊ณ ์ˆ˜๋ณด๋‹ค ๋งŽ์€ ์ œํ’ˆ ์ฐพ๊ธฐ

    ์•„๋ž˜์™€ ๊ฐ™์ด $๋ฅผ ํ†ตํ•ด ํ•„๋“œ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    db.itemList.find({"$expr" : { "$gt" : ["$orders", "$stock"] } })
  • ์ฃผ๋ฌธ๋Ÿ‰์ด ์žฌ๊ณ ์ˆ˜์™€ ๊ฐ™์œผ๋ฉด์„œ, ์ฃผ๋ฌธ๋Ÿ‰์ด 100์„ ๋„˜๋Š” ์ œํ’ˆ ์ฐพ๊ธฐ
    db.itemList.find({"$expr" : { "$and" : [{ "$eq" : ["$orders", "$stock"] }, 
    										{ "$gt" : ["$orders", 100] }] } })
  • ์ฃผ๋ฌธ๋Ÿ‰์ด 10 ์ดํ•˜์ด๋ฉด ๊ฐ€๊ฒฉ(price)์„ 2000์› ๋นผ๊ณ , ์•„๋‹ˆ๋ฉด ์ฃผ๋ฌธ๋Ÿ‰์ด ์žฌ๊ณ ์ˆ˜๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ฐพ๊ธฐ

    ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ๊ฑด๋ฌธ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    db.itemList.find({"$expr" : { "$gt": [{"$cond": 
    									   {if: {"$lt": ["$orders", 10]}, 
                                            then: {"$subtract": ["$price", 2000]}, 
                                            else: "$orders"}}], "$stock"} })

๐Ÿ“Œ ๋ฐฐ์—ด์—ฐ์‚ฐ์ž(Array Operators)

1. ๋ฌธ๋ฒ•

  • $all
{ <array_field> : { "$all" : [<array>] } }
  • $size
{ <array_field> : { "$size" : <number> } }
  • $elemMatch
{ <array_field> : {"$elementMatch": { <field> : <value> }}}

2. ์—ฐ์‚ฐ์ž : $all, $size, $elemMatch

operator์„ค๋ช…
$all์ˆœ์„œ์— ์ƒ๊ด€ ์—†์ด ์ง€์ •๋œ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜
$size์ง€์ •๋œ ๋ฐฐ์—ด ํ•„๋“œ์™€ ์ฃผ์–ด์ง„ ๊ธธ์ด๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜
$elemMatch์กฐ๊ฑด๊ณผ ๋งž๋Š” ๋ฐฐ์—ด ์† ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๋„ํ๋จผํŠธ ๋ฐ˜ํ™˜

3. ์˜ˆ์‹œ

ํ˜ธํ…”์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” hotelList์ปฌ๋ ‰์…˜์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ ์•ˆ์— ํ˜ธํ…”์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐฐ์—ด๋กœ ๋‹ด๊ณ  ์žˆ๋Š” amenitiesํ•„๋“œ๊ฐ€ ์žˆ๋‹ค.

  • wifi๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ˜ธํ…”์ฐพ๊ธฐ
    db.hotelList.find({ "amenities" : "wifi" })

    ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ์•Œ์•„์„œ ๋ฐฐ์—ด ์•ˆ์˜ ์š”์†Œ ์ค‘ wifi๊ฐ€ ํฌํ•จ๋œ ๋„ํ๋จผํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    ๋งŒ์•ฝ, ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ๋Š”๋‹ค๋ฉด

    db.hotelList.find({ "amenities" : ["wifi"] }) // X!

    ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์— ์ •ํ™•ํžˆ ์ง€์ •๋œ ์š”์†Œ๋งŒ(wifi ํ•˜๋‚˜๋งŒ) ์กด์žฌํ•˜๋Š” ๋„ํ๋จผํŠธ๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค.

  • ๋‚ด๊ฐ€ ์„ ํƒํ•œ amenities๋ฅผ ๊ฐ–๋Š” ํ˜ธํ…” ์ฐพ๊ธฐ
    db.hotelList.find({ "amenities" : ["wifi", "towel" ... ] })
    db.hotelList.find({ "amenities" : ["towel", "wifi" ... ] })

    ์œ„์˜ ๋‘ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐฐ์—ด์—์„œ ์š”์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์š”์†Œ์˜ ์ˆœ์„œ์— ๊ด€๊ณ„ ์—†์ด ์š”์†Œ๋“ค์ด ํฌํ•จ๋œ ๋„ํ๋จผํŠธ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•ด์„œ $all์„ ์‚ฌ์šฉํ•œ๋‹ค.

    db.hotelList.find({"amenities" : { "$all" : ["towel", "wifi" ... ]} })
  • ๋‚ด๊ฐ€ ์„ ํƒํ•œ amenities๋ฅผ ๊ฐ€์ง€๋ฉด์„œ ์ œ๊ณตํ•˜๋Š” amenities์˜ ์ˆ˜๊ฐ€ 20๊ฐœ์ธ ํ˜ธํ…” ์ฐพ๊ธฐ
    db.hotelList.find({"amenities" : { "$size" : 20, "$all" : ["towel", "wifi" ... ]} })

๐Ÿ“Œ Projection

๋‘๋ฒˆ์งธ ์ธ์ž๋กœ projection์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„ฃ์€ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋„ํ๋จผํŠธ๋ฅผ ์ฐพ๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ๋„ฃ์€ ํŠน์ • ํ•„๋“œ๋งŒ ๊ฒฐ๊ณผ๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„ํ๋จผํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋งŒ ์–ป๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์šฉํ•  ๋•Œ์—๋Š” 0๊ณผ 1์„ ์‚ฌ์šฉํ•ด ๊ฒฐ๊ณผ์—์„œ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ํ‘œ์‹œํ•˜์ง€ ์•Š์„ ํ•„๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค. 0์€ ์ง€์ •ํ•œ ํ•„๋“œ๋ฅผ ์ œ์™ธ, 1์€ ์ง€์ •ํ•œ ํ•„๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉฐ, 0๊ณผ 1์„ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์˜ˆ์™ธ์ ์œผ๋กœ "_id"๋Š” 1์ด ๋””ํดํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— "_id"๋ฅผ 0์œผ๋กœ ์ง€์ •ํ•  ๋•Œ์—๋งŒ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋ฌธ๋ฒ•

๋‘๋ฒˆ์งธ ์ธ์ž๋กœ projection์„ ์‚ฝ์ž…ํ•œ๋‹ค.

db.collection.find({ <query> }, { <projection> })

2. ์˜ˆ์‹œ

ํ•™์ƒ๋“ค์˜ ์ด๋ฆ„(name), ์‹œํ—˜์ ์ˆ˜(score), ์ˆ™์ œ์ ์ˆ˜(homework), ์ˆ˜ํ–‰ํ‰๊ฐ€(performance_grade)์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธด studentList๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

  • ์ ์ˆ˜๊ฐ€ 80์  ์ด์ƒ์ธ ํ•™์ƒ ์ด๋ฆ„ ์ฐพ๊ธฐ
    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์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์ ์ˆ˜๊ฐ€ 80์  ์ด์ƒ์— ํ•ด๋‹นํ•˜๋Š” ํ•™์ƒ ์ด๋ฆ„๊ณผ ์ˆ™์ œ์ ์ˆ˜ ์ฐพ๊ธฐ
    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

$elemMatch๋Š” ๋ฐฐ์—ด์—ฐ์‚ฐ์ž์™€ ํ”„๋กœ์ ์…˜์—์„œ ๋ชจ๋‘ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ์ฒซ๋ฒˆ์งธ์ธ์ž์ธ find ๋ช…๋ น์ฟผ๋ฆฌ์— ์“ฐ์ผ ๊ฒฝ์šฐ, ๋ฐฐ์—ด ํ•„๋“œ์˜ ์„œ๋ธŒ ๋„ํ๋จผํŠธ ํ•„๋“œ ์ค‘ ์ฟผ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋Š” ๋„ํ๋จผํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค. ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ํ”„๋กœ์ ์…˜ ๋ถ€๋ถ„์— ์“ฐ์ผ ๊ฒฝ์šฐ, ์ง€์ •๋œ ๊ธฐ์ค€๊ณผ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๋ฐฐ์—ด ์š”์†Œ๋งŒ ๊ฒฐ๊ณผ์— ํฌํ•จํ•œ๋‹ค.

1. ๋ฌธ๋ฒ•

  • query
db.collection.find({ <field>: { $elemMatch: { <query1>, <query2>, ... } } })
  • projection
db.collection.find({ <query> }, { <field>: { $elemMatch: { <query1>, <query2>, ... } } })

2. ์˜ˆ์‹œ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์ž!
mongodb $elemMatch(query)
mongodb $elemMatch(projection)

๐Ÿ“Œ ๋ฐฐ์—ด๊ณผ ์„œ๋ธŒ ๋„ํ๋จผํŠธ ์ฟผ๋ฆฌํ•˜๊ธฐ

Dot Notation์„ ์‚ฌ์šฉํ•ด ์„œ๋ธŒ ๋„ํ๋จผํŠธ๋ฅผ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์—์„œ Dot Notation์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ํŠน์ •ํ•ด์•ผ ํ•œ๋‹ค.

1. ๋ฌธ๋ฒ•

.์œผ๋กœ ์›ํ•˜๋Š” ๋งŒํผ ์ค‘์ฒฉ๋œ ๋„ํ๋จผํŠธ๋กœ ์ด๋™ํ•ด ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

db.collection.find({ "<field1>.<other_field>.<also_a_field>" : "value" })

2. ์˜ˆ์‹œ

ํ•™์ƒ๋“ค์ด ์ˆ˜๊ฐ•ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ณผ๋ชฉ์— ๋Œ€ํ•œ ๋ฐฐ์—ด์ด ์žˆ๊ณ , ๊ทธ ์•ˆ์— ํ•ด๋‹น ๊ณผ๋ชฉ์— ๋Œ€ํ•œ ์ˆ˜๊ฐ• ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ปฌ๋ ‰์…˜ 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})

    ์œ„์™€ ๊ฐ™์ด ์ ์œผ๋กœ ์ ‘๊ทผํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

profile
it's me!:)

0๊ฐœ์˜ ๋Œ“๊ธ€