Docs Menu
Docs Home
/
MongoDB ๋งค๋‰ด์–ผ
/

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ๋งŒ๋“ค๊ธฐ
  • ๊ณ ๋ ค ์‚ฌํ•ญ
  • ํ–‰๋™
  • ์ œํ•œ ์‚ฌํ•ญ
  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ฟผ๋ฆฌ/์ •๋ ฌ ์ง€์›

MongoDB๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํ•„๋“œ ๋˜๋Š” ํ•„๋“œ ์„ธํŠธ์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. MongoDB๋Š” ๋™์  ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฆ„์„ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ž„์˜์ ์ธ ํ•„๋“œ๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MongoDB ๋ฒ„์ „ 4.2์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

MongoDB 4.2์—๋Š” ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ž„์˜์˜ ํ•„๋“œ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

userMetadata ํ•„๋“œ ์•„๋ž˜์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.

{ "userMetadata" : { "likes" : [ "dogs", "cats" ] } }
{ "userMetadata" : { "dislikes" : "pickles" } }
{ "userMetadata" : { "age" : 45 } }
{ "userMetadata" : "inactive" }

๊ด€๋ฆฌ์ž๋Š” userMetadata ์˜ ๋ชจ๋“  ํ•˜์œ„ ํ•„๋“œ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

userMetadata ์— ๋Œ€ํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” userMetadata, userMetadata.likes, userMetadata.dislikes ๋ฐ userMetadata.age ์— ๋Œ€ํ•œ ๋‹จ์ผ ํ•„๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.userData.createIndex( { "userMetadata.$**" : 1 } )

์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.userData.find({ "userMetadata.likes" : "dogs" })
db.userData.find({ "userMetadata.dislikes" : "pickles" })
db.userData.find({ "userMetadata.age" : { $gt : 30 } })
db.userData.find({ "userMetadata" : "inactive" })

userMetadata ์— ๋Œ€ํ•œ ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค๋Š” userMetadata ๊ฐ’์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋งŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์›Œํฌ๋กœ๋“œ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค ๊ณ„ํš์„ ๋Œ€์ฒดํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š”์ธ๋ฑ์Šค ๋งŒ๋“ค๊ธฐ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ œํ•œ์— ๋Œ€ํ•œ ์ „์ฒด ๋ฌธ์„œ๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ œํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š” .

์ค‘์š”

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด mongod featureCompatibilityVersion ์ด 4.2 ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. fCV ์„ค์ •์— ๋Œ€ํ•œ ์ง€์นจ์€ MongoDB 6.0 ๋ฐฐํฌ์—์„œ ๊ธฐ๋Šฅ ํ˜ธํ™˜์„ฑ ๋ฒ„์ „ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

createIndexes ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ช…๋ น ๋˜๋Š” ํ•ด๋‹น shell ํ—ฌํผ์ธ createIndex() ๋˜๋Š” createIndexes() ์„ ์‚ฌ์šฉํ•˜์—ฌ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ • ํ•„๋“œ์˜ ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

db.collection.createIndex( { "fieldA.$**" : 1 } )

์ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด MongoDB๋Š” fieldA ์˜ ๋ชจ๋“  ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๊ฐ€ ์ค‘์ฒฉ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฌธ์„œ/๋ฐฐ์—ด์— ์žฌ๊ท€๋˜์–ด ๋ฌธ์„œ/๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด product_catalog ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ์— product_attributes ํ•„๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. product_attributes ํ•„๋“œ์—๋Š” ๋‚ด์žฅ๋œ ๋ฌธ์„œ ๋ฐ ๋ฐฐ์—ด์„ ํฌํ•จํ•˜์—ฌ ์ž„์˜์˜ ์ค‘์ฒฉ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
"product_name" : "Spy Coat",
"product_attributes" : {
"material" : [ "Tweed", "Wool", "Leather" ]
"size" : {
"length" : 72,
"units" : "inches"
}
}
}
{
"product_name" : "Spy Pen",
"product_attributes" : {
"colors" : [ "Blue", "Black" ],
"secret_feature" : {
"name" : "laser",
"power" : "1000",
"units" : "watts",
}
}
}

๋‹ค์Œ ์ž‘์—…์€ product_attributes ํ•„๋“œ์— ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.products_catalog.createIndex( { "product_attributes.$**" : 1 } )

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” product_attributes ๋˜๋Š” ํฌํ•จ๋œ ํ•„๋“œ์— ๋Œ€ํ•œ ์ž„์˜์˜ ๋‹จ์ผ ํ•„๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.products_catalog.find( { "product_attributes.size.length" : { $gt : 60 } } )
db.products_catalog.find( { "product_attributes.material" : "Leather" } )
db.products_catalog.find( { "product_attributes.secret_feature.name" : "laser" } )

์ฐธ๊ณ 

๊ฒฝ๋กœ๋ณ„ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ๊ตฌ๋ฌธ์€ wildcardProjection ์˜ต์…˜๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ wildcard ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ์ œ ๋Š” ๋‹จ์ผ ํ•„๋“œ ๊ฒฝ๋กœ์— ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ƒ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฌธ์„œ์˜ ๋ชจ๋“  ํ•„๋“œ ๊ฐ’( _id ์ œ์™ธ)์„ ์ธ๋ฑ์Šคํ•˜๋ ค๋ฉด "$**" ์„(๋ฅผ) ์ธ๋ฑ์Šค ํ‚ค๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

db.collection.createIndex( { "$**" : 1 } )

MongoDB๋Š” ์ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ collection์˜ ๊ฐ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ํ•„๋“œ๊ฐ€ ์ค‘์ฒฉ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฌธ์„œ/๋ฐฐ์—ด์— ์žฌ๊ท€๋˜์–ด ๋ฌธ์„œ/๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ๋Š” ๋ชจ๋“  ํ•„๋“œ ๊ฒฝ๋กœ์— ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๊ธฐ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ 

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ _id ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์— _id ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด ํ•ด๋‹น ํ•„๋“œ๋ฅผ wildcardProjection ๋ฌธ์„œ์— ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ ์€ wildcard ์ธ๋ฑ์Šค ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฌธ์„œ์—์„œ ์—ฌ๋Ÿฌ ํŠน์ • ํ•„๋“œ์˜ ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

db.collection.createIndex(
{ "$**" : 1 },
{ "wildcardProjection" :
{ "fieldA" : 1, "fieldB.fieldC" : 1 }
}
)

MongoDB๋Š” ์ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ collection์˜ ๊ฐ ๋ฌธ์„œ์— ์ง€์ •๋œ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ํ•„๋“œ๊ฐ€ ์ค‘์ฒฉ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฌธ์„œ/๋ฐฐ์—ด์— ์žฌ๊ท€๋˜์–ด ๋ฌธ์„œ/๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” _id ํ•„๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  wildcardProjection ๋ฌธ์„œ์—์„œ ํฌํ•จ ๋ฐ ์ œ์™ธ ๋ฌธ์„ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. wildcardProjection ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ ์€ wildcard ์ธ๋ฑ์Šค ์˜ต์…˜ ์„ ์ฐธ์กฐ ํ•˜์„ธ์š” .

์˜ˆ์‹œ ๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ปค๋ฒ„๋ฆฌ์ง€์— ํŠน์ • ํ•„๋“œ ํฌํ•จ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŠน์ • ํ•„๋“œ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ๋ฌธ์„œ ๋‚ด ๋ชจ๋“  ํ•„๋“œ์˜ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

db.collection.createIndex(
{ "$**" : 1 },
{ "wildcardProjection" :
{ "fieldA" : 0, "fieldB.fieldC" : 0 }
}
)

MongoDB๋Š” ์ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ํ•„๋“œ ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ์ปฌ๋ ‰์…˜์˜ ๊ฐ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •๋œ ํ•„๋“œ๊ฐ€ ์ค‘์ฒฉ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฌธ์„œ/๋ฐฐ์—ด์— ์žฌ๊ท€๋˜์–ด ๋ฌธ์„œ/๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ปค๋ฒ„๋ฆฌ์ง€์—์„œ ํŠน์ • ํ•„๋“œ ์ƒ๋žต์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ 

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” _id ํ•„๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  wildcardProjection ๋ฌธ์„œ์—์„œ ํฌํ•จ ๋ฐ ์ œ์™ธ ๋ฌธ์„ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. wildcardProjection ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ ์€ wildcard ์ธ๋ฑ์Šค ์˜ต์…˜ ์„ ์ฐธ์กฐ ํ•˜์„ธ์š” .

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์ฃผ์–ด์ง„ ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž์—์„œ ์ตœ๋Œ€ ํ•˜๋‚˜ ์˜ ํ•„๋“œ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ฟผ๋ฆฌ ์ง€์›์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ฟผ๋ฆฌ/์ •๋ ฌ ์ง€์›์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด mongod featureCompatibilityVersion ์ด 4.2 ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. fCV ์„ค์ •์— ๋Œ€ํ•œ ์ง€์นจ์€ MongoDB 6.0 ๋ฐฐํฌ์—์„œ ๊ธฐ๋Šฅ ํ˜ธํ™˜์„ฑ ๋ฒ„์ „ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ _id ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์— _id ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด ์™€์ผ๋“œ์นด๋“œ ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ์— ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: { "_id" : 1 }).

  • ์ปฌ๋ ‰์…˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” collection์˜ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค์™€ ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ํฌ์†Œ ์ธ๋ฑ์Šค(sparse indexes) ๋กœ ๋ถ„๋ฅ˜๋˜๋ฉฐ, ์ธ๋ฑ์Šค๋œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์„œ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ธ๋ฑ์Šค ํ•„๋“œ์— null ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ฐ์ฒด(์˜ˆ: ๋‚ด์žฅ๋œ ๋ฌธ์„œ) ๋˜๋Š” ๋ฐฐ์—ด์ธ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•  ๋•Œ ํŠน์ • ๋™์ž‘์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•„๋“œ๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ฐ์ฒด๋กœ ๋‚ด๋ ค๊ฐ€ ๊ทธ ๋‚ด์šฉ์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฐœ๊ฒฌ๋˜๋Š” ์ถ”๊ฐ€๋กœ ๋‚ด์žฅ๋œ ๋ฌธ์„œ๋กœ ๊ณ„์† ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค.

  • ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๊ณ  ๊ฐ ์š”์†Œ๋ฅผ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๊ฐ์ฒด๋กœ ๋‚ด๋ ค๊ฐ€ ํ•ด๋‹น ๋‚ด์šฉ์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

    • ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด, ์ฆ‰ ์ƒ์œ„ ๋ฐฐ์—ด ๋‚ด์— ์ง์ ‘ ํฌํ•จ๋œ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ํฌํ•จ๋œ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด ๋ฐฐ์—ด์„ ๋‹จ์ผ ๊ฐ’์œผ๋กœ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ(๋น„๊ฐ์ฒด/๋ฐฐ์—ด) ๊ฐ’์„ ์ธ๋ฑ์Šค์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธ ๊ฐ’(์ฆ‰, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•„๋“œ)์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€๋กœ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์„ ๊ณ„์† ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํ•„๋“œ์˜ ์ „์ฒด ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ด ๊ธฐ๋ณธ ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

{
"parentField" : {
"nestedField" : "nestedValue",
"nestedObject" : {
"deeplyNestedField" : "deeplyNestedValue"
},
"nestedArray" : [
"nestedArrayElementOne",
[ "nestedArrayElementTwo" ]
]
}
}

parentField ๊ฐ€ ํฌํ•จ๋œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

  • "parentField.nestedField" : "nestedValue"

  • "parentField.nestedObject.deeplyNestedField" : "deeplyNestedValue"

  • "parentField.nestedArray" : "nestedArrayElementOne"

  • "parentField.nestedArray" : ["nestedArrayElementTwo"]

parentField.nestedArray ์˜ ๋ ˆ์ฝ”๋“œ์—๋Š” ๊ฐ ์š”์†Œ์˜ ๋ฐฐ์—ด ์œ„์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์š”์†Œ๋ฅผ ์ธ๋ฑ์Šค์— ๊ธฐ๋กํ•  ๋•Œ ๋ฐฐ์—ด ์š”์†Œ ์œ„์น˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ณ„์† ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ ์€ ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ๋™์ž‘์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” .

์ค‘์ฒฉ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ๋™์ž‘์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ค‘์ฒฉ ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•˜์„ธ์š” .

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฐ์ฒด๋กœ ๋‚ด๋ ค๊ฐ€ ๋‚ด์šฉ์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
"parentField" : {
"nestedField" : "nestedValue",
"nestedArray" : ["nestedElement"]
"nestedObject" : {
"deeplyNestedField" : "deeplyNestedValue"
}
}
}

parentField ๊ฐ€ ํฌํ•จ๋œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ฐ์ฒด๋กœ ๋‚ด๋ ค๊ฐ€ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์ž์ฒด๊ฐ€ ๊ฐ์ฒด์ธ ๊ฐ ํ•„๋“œ(์ฆ‰, ๋‚ด์žฅ๋œ ๋ฌธ์„œ)์— ๋Œ€ํ•ด ๊ฐ์ฒด๋กœ ๋‚ด๋ ค๊ฐ€์„œ ํ•ด๋‹น ๋‚ด์šฉ์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐ์—ด์ธ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•ด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ(๋น„๊ฐ์ฒด/๋ฐฐ์—ด) ๊ฐ’์„ ์ธ๋ฑ์Šค์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธ ๊ฐ’(์ฆ‰, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•„๋“œ)์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€๋กœ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์„ ๊ณ„์† ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํ•„๋“œ์˜ ์ „์ฒด ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ด ๊ธฐ๋ณธ ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ๊ธฐ๋ก์„ ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • "parentField.nestedField" : "nestedValue"

  • "parentField.nestedObject.deeplyNestedField" : "deeplyNestedValue"

  • "parentField.nestedArray" : "nestedElement"

์ค‘์ฒฉ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ๋™์ž‘์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ค‘์ฒฉ ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•˜์„ธ์š” .

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์ค‘์ฒฉ ๋ฐฐ์—ด์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜์—ฌ ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด ์ž์ฒด๊ฐ€ ์ƒ์œ„ ๋ฐฐ์—ด(์˜ˆ: ๋‚ด์žฅ๋œ ๋ฐฐ์—ด)์˜ ์š”์†Œ์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋Œ€์‹  ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋Œ€์‹  ์ „์ฒด ๋ฐฐ์—ด์„ ๊ฐ’์œผ๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
"parentArray" : [
"arrayElementOne",
[ "embeddedArrayElement" ],
"nestedObject" : {
"nestedArray" : [
"nestedArrayElementOne",
"nestedArrayElementTwo"
]
}
]
}

parentArray ๊ฐ€ ํฌํ•จ๋œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฐฐ์—ด๋กœ ๋‚ด๋ ค๊ฐ€ ํ•ด๋‹น ๋‚ด์šฉ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐ์—ด์ธ ๊ฐ ์š”์†Œ(์˜ˆ: ๋‚ด์žฅ๋œ ๋ฐฐ์—ด)์— ๋Œ€ํ•ด ์ „์ฒด ๋ฐฐ์—ด์„ ๊ฐ’์œผ๋กœ ์ธ๋ฑ์Šคํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ์ฒด์ธ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๊ฐ์ฒด๋กœ ๋‚ด๋ ค๊ฐ€ ํ•ด๋‹น ๋‚ด์šฉ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ(๋น„๊ฐ์ฒด/๋ฐฐ์—ด) ๊ฐ’์„ ์ธ๋ฑ์Šค์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธ ๊ฐ’(์ฆ‰, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•„๋“œ)์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€๋กœ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์„ ๊ณ„์† ์ˆœํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํ•„๋“œ์˜ ์ „์ฒด ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ด ๊ธฐ๋ณธ ๊ฐ’์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ๋ฌธ์„œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ๊ธฐ๋ก์„ ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • "parentArray" : "arrayElementOne"

  • "parentArray" : ["embeddedArrayElement"]

  • "parentArray.nestedObject.nestedArray" : "nestedArrayElementOne"

  • "parentArray.nestedObject.nestedArray" : "nestedArrayElementTwo"

parentField.nestedArray ์˜ ๋ ˆ์ฝ”๋“œ์—๋Š” ๊ฐ ์š”์†Œ์˜ ๋ฐฐ์—ด ์œ„์น˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์š”์†Œ๋ฅผ ์ธ๋ฑ์Šค์— ๊ธฐ๋กํ•  ๋•Œ ๋ฐฐ์—ด ์š”์†Œ ์œ„์น˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ณ„์† ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ ์€ ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŒ

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 6.3, 6.0.5 ๋ฐ 5.0.16๋ถ€ํ„ฐ wildcardProjection ํ•„๋“œ๋Š” ์ธ๋ฑ์Šค ํ”„๋กœ์ ์…˜์„ ์ œ์ถœ๋œ ํ˜•์‹์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์˜ ์„œ๋ฒ„์—์„œ๋Š” ํ”„๋กœ์ ์…˜์„ ์ •๊ทœํ™”๋œ ํ˜•ํƒœ๋กœ ์ €์žฅํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ listIndexes ๋ฐ db.collection.getIndexes() ๋ช…๋ น์˜ ์ถœ๋ ฅ์— ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ collection์„ ์ƒค๋”ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒค๋”ฉํ•˜๋ ค๋Š” ํ•„๋“œ์— ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ƒค๋“œ ํ‚ค ์„ ํƒ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒค๋“œ ํ‚ค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” .

  • ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์—๋Š” ๋‹ค์Œ ์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ์™€์ผ๋“œ์นด๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ธ๋ฑ์Šค ์œ ํ˜•์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ค‘์š”

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์™€์ผ๋“œ์นด๋“œ ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์™€ ๊ตฌ๋ณ„๋˜๋ฉฐ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” $text ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ƒ์„ฑ ์ œํ•œ์— ๋Œ€ํ•œ ์ „์ฒด ๋ฌธ์„œ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค ์œ ํ˜• ๋˜๋Š” ์†์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ์ด ๋ชจ๋‘ ์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ์ฟผ๋ฆฌ ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜๋Š” ํ•„๋“œ๋ฅผ ์ •ํ™•ํžˆ ํ•˜๋‚˜๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ์…˜์€ _id ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์™ธํ•˜๊ณ  ์ฟผ๋ฆฌ ํ•„๋“œ ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • ์ง€์ •๋œ ์ฟผ๋ฆฌ ํ•„๋“œ๋Š” ์ ˆ๋Œ€ ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค.

employees collection์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

db.employees.createIndex( { "$**" : 1 } )

๋‹ค์Œ ์ž‘์—…์€ ๋‹จ์ผ ํ•„๋“œ lastName์— ๋Œ€ํ•ด ์ฟผ๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ ๋ฌธ์„œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํ”„๋กœ์ ํŠธํ•ฉ๋‹ˆ๋‹ค.

db.employees.find(
{ "lastName" : "Doe" },
{ "_id" : 0, "lastName" : 1 }
)

์ง€์ •๋œ lastName ๊ฐ€ ๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฐ€์ • ํ•˜์— MongoDB๋Š” $** ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์ตœ๋Œ€ ํ•˜๋‚˜ ์˜ ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž ํ•„๋“œ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰:

  • MongoDB๋Š” ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž์˜ ํ•œ ๋ถ€๋ถ„์„ ์ถฉ์กฑํ•˜๊ณ  ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ถฉ์กฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • MongoDB๋Š” ํ•˜๋‚˜์˜ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์ˆ ์–ด์˜ ํ•œ ๋ถ€๋ถ„์„ ์ถฉ์กฑํ•˜๊ณ  ๋‹ค๋ฅธ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ถฉ์กฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ๋‹จ์ผ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ ํ•„๋“œ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ MongoDB๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๋งŒ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๋ชจ๋“  ํ•„๋“œ๋Š” ์ธ๋ฑ์Šค ์—†์ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ MongoDB๋Š” ์ฟผ๋ฆฌ $or ๋˜๋Š” ์• ๊ทธ๋ฆฌ๊ฒŒ์ด์…˜ $or ์—ฐ์‚ฐ์ž์˜ ๊ฐ ๋…๋ฆฝ์ ์ธ ์ธ์ˆ˜๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MongoDB๋Š” ๋‹ค์Œ ์‚ฌํ•ญ์ด ๋ชจ๋‘ ์ฐธ์ธ ๊ฒฝ์šฐ์—๋งŒ ๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sort()

  • ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  • sort() ๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž ํ•„๋“œ ๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ง€์ •๋œ ํ•„๋“œ๋Š” ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์˜ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด MongoDB๋Š” ์ •๋ ฌ์— ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. MongoDB๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž์˜ ์ธ๋ฑ์Šค์™€ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ sort() ์ž‘์—…์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ธ๋ฑ์Šค ๊ต์ฐจ ๋ฐ ์ •๋ ฌ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

products collection์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

db.products.createIndex( { "product_attributes.$**" : 1 } )

๋‹ค์Œ ์ž‘์—…์€ ๋‹จ์ผ ํ•„๋“œ product_attributes.price ๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

db.products.find(
{ "product_attributes.price" : { $gt : 10.00 } },
).sort(
{ "product_attributes.price" : 1 }
)

์ง€์ •๋œ price ๊ฐ€ ๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด MongoDB๋Š” product_attributes.$** ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ find() ๋ฐ sort() ์„ ๋ชจ๋‘ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ ํŒจํ„ด์„ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .

  • ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ฟผ๋ฆฌ

  • ํ•„๋“œ๊ฐ€ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” ์ฟผ๋ฆฌ

  • ํ•„๋“œ๊ฐ€ null๊ณผ ๊ฐ™์€์ง€ ํ™•์ธํ•˜๋Š” ์ฟผ๋ฆฌ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ ๋ฐ ์• ๊ทธ๋ฆฌ๊ฒŒ์ด์…˜ ํŒจํ„ด์„ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์‹ฑ ์ค‘์— ๋ฐฐ์—ด์— ์ง€์ •๋œ ์š”์†Œ์˜ ๋ฐฐ์—ด ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MongoDB๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค(์˜ˆ: parentArray.0.nestedArray.0)๊ฐ€ ์žˆ๋Š” ํ•„๋“œ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜๋Š” ์ฟผ๋ฆฌ์— ๋‹ต๋ณ€ํ•˜๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ์†๋œ ๊ฐ ์ค‘์ฒฉ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— MongoDB๋Š” ๊ฒฝ๋กœ์— 8 ๊ฐœ ์ด์ƒ์˜ ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ์—์„œ ์ง€์ •๋œ ํ•„๋“œ ๊ฒฝ๋กœ์— ์‘๋‹ตํ•˜๋Š” ๋ฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. MongoDB๋Š” ์—ฌ์ „ํžˆ ์ฟผ๋ฆฌ์˜ ๋‹ค๋ฅธ ํ•„๋“œ ๊ฒฝ๋กœ์— ์‘๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
"parentObject" : {
"nestedArray" : [
"elementOne",
{
"deeplyNestedArray" : [ "elementTwo" ]
}
]
}
}

MongoDB๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด parentObject ๊ฐ€ ํฌํ•จ๋œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • "parentObject.nestedArray.0" : "elementOne"

  • "parentObject.nestedArray.1.deeplyNestedArray.0" : "elementTwo"

์ฟผ๋ฆฌ ์กฐ๊ฑด์ž์˜ ์ง€์ •๋œ ํ•„๋“œ ๊ฒฝ๋กœ๊ฐ€ 8๊ฐœ ์ด์ƒ์˜ ๋ช…์‹œ์  ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ MongoDB๋Š” ํ•ด๋‹น ํ•„๋“œ ๊ฒฝ๋กœ์— ์‘๋‹ตํ•  ๋•Œ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  MongoDB๋Š” ์ฟผ๋ฆฌ์— ๋‹ต๋ณ€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ ํ•ฉํ•œ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒ ํ•˜๊ฑฐ๋‚˜ collection ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ž์ฒด๋Š” ๋ฌธ์„œ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋™์•ˆ ๋ฌธ์„œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊นŠ์ด์— ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ œํ•œ์€ ์ •ํ™•ํ•œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ์ฟผ๋ฆฌ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์—†์ด ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ MongoDB๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์ฟผ๋ฆฌ์— ๋‹ต๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • "parentObject.nestedArray" : "elementOne"

  • "parentObject.nestedArray.deeplyNestedArray" : "elementTwo"

ํŒ

๋‹ค์Œ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋Œ์•„๊ฐ€๊ธฐ

๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค ๋ฐ”์šด๋“œ