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

db.collection.createIndexes()

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

  • ์ •์˜
  • ํ˜ธํ™˜์„ฑ
  • Stable API
  • ์˜ต์…˜
  • ๋ชจ๋“  ์ธ๋ฑ์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ์˜ต์…˜
  • ๋ฐ์ดํ„ฐ ์ •๋ ฌ ์˜ต์…˜
  • text ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜
  • 2dsphere ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜
  • 2d ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜
  • wildcard ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜
  • ๋™์ž‘
  • ๊ธฐ์กด ์ธ๋ฑ์Šค ๋‹ค์‹œ ๋งŒ๋“ค๊ธฐ
  • ์ธ๋ฑ์Šค ์˜ต์…˜
  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค
  • ํŠธ๋žœ์žญ์…˜
  • ์˜ˆ์‹œ
  • ์˜ต์…˜ ์—†์ด ์ธ๋ฑ์Šค ์ƒ์„ฑ
  • ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜์—ฌ ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๊ธฐ
  • ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ๋งŒ๋“ค๊ธฐ
  • ์ฟผ๋Ÿผ ์ปค๋ฐ‹์œผ๋กœ ์ธ๋ฑ์Šค ์ƒ์„ฑ
  • ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค ์ƒ์„ฑ
  • ์ถ”๊ฐ€ ์ •๋ณด

๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํฌํ•จ๋œ MongoDB

์ด ํŽ˜์ด์ง€์—์„œ๋Š” mongosh ๋ฉ”์„œ๋“œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. MongoDB ๋“œ๋ผ์ด๋ฒ„์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

C#Java SyncNode.jsPyMongoCC++GoJava RSKotlin CoroutineKotlin SyncPHPMotorMongoidRustScalaSwift
db.collection.createIndexes( [ keyPatterns ], options, commitQuorum )

์ปฌ๋ ‰์…˜์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ๋นŒ๋“œ๊ฐ€ ๋ณต์ œ๋ณธ ์„ธํŠธ์™€ ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ๋ณต์ œ๋ณธ ์„ธํŠธ์— ๋Œ€ํ•œ ๋กค๋ง ์ธ๋ฑ์Šค ๋นŒ๋“œ์— ์„ค๋ช…๋œ ๋กค๋ง ์ธ๋ฑ์Šค ๋นŒ๋“œ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

db.collection.createIndexes() ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
keyPatterns
๋ฌธ์„œ

์ธ๋ฑ์Šค ์‚ฌ์–‘ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ฌธ์„œ์—๋Š” ํ•„๋“œ์™€ ๊ฐ’ ์Œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•„๋“œ๋Š” ์ธ๋ฑ์Šค ํ‚ค์ด๊ณ  ๊ฐ’์€ ํ•ด๋‹น ํ•„๋“œ์˜ ์ธ๋ฑ์Šค ์œ ํ˜•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ์˜ ์˜ค๋ฆ„์ฐจ์ˆœ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ 1 ๊ฐ’์„ ์ง€์ •ํ•˜๊ณ , ๋‚ด๋ฆผ์ฐจ์ˆœ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ -1 ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

MongoDB๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ธ๋ฑ์Šค ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ธ๋ฑ์Šค ์œ ํ˜•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

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

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณตํ•ฉ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

options
๋ฌธ์„œ
์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์ƒ์„ฑ์„ ์ œ์–ดํ•˜๋Š” ์˜ต์…˜ ์ง‘ํ•ฉ์ด ํฌํ•จ๋œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.
์ •์ˆ˜ ๋˜๋Š” ๋ฌธ์ž์—ด

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ๋“ฑ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ํˆฌํ‘œ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„์˜ ์ตœ์†Œ ์ˆ˜(์ฆ‰, ์ฟผ๋Ÿผ ์ปค๋ฐ‹)์ด๋ฉฐ, ์ด๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ๊ฐ€ indexes์„(๋ฅผ) ์ค€๋น„๋จ์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ์ „์— ์„ฑ๊ณต์ ์ธ ์ธ๋ฑ์Šค ๋นŒ๋“œ๋ฅผ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 'ํˆฌํ‘œ' ๋ฉค๋ฒ„๋Š” members[n].votes์ด(๊ฐ€) 0๋ณด๋‹ค ํฐ ๋ชจ๋“  ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค.

๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • "votingMembers" - ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๋Š” ํˆฌํ‘œ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„(๊ธฐ๋ณธ๊ฐ’)์ž…๋‹ˆ๋‹ค.

  • "majority" - ๋ฐ์ดํ„ฐ ๋ณด์œ  ํˆฌํ‘œ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„์˜ ๋‹จ์ˆœ ๊ณผ๋ฐ˜์ˆ˜์ž…๋‹ˆ๋‹ค.

  • <int> - ํŠน์ • ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๋Š” ํˆฌํ‘œ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค.

  • 0 - ์ฟผ๋Ÿผ ํˆฌํ‘œ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฉค๋ฒ„๋Š” ์ธ๋ฑ์Šค ์ž‘์„ฑ์„ ๋™์‹œ์— ์‹œ์ž‘ํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค ์ž‘์„ฑ์„ ์™„๋ฃŒํ•˜๊ธฐ ์ „์— ํˆฌํ‘œํ•˜๊ฑฐ๋‚˜ ์ฟผ๋Ÿผ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฟผ๋Ÿผ ์ปค๋ฐ‹์ด 0์ธ ์ธ๋ฑ์Šค ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜์ค‘์— setIndexCommitQuorum๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋Ÿผ ์ปค๋ฐ‹์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ๋ณต์ œ๋ณธ ์„ธํŠธ ํƒœ๊ทธ ์ด๋ฆ„.

์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ํ™˜๊ฒฝ์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๋ฐฐํฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • MongoDB Atlas: ํด๋ผ์šฐ๋“œ์—์„œ์˜ MongoDB ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์™„์ „ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค

์ฐธ๊ณ 

์ด ๋ช…๋ น์€ ๋ชจ๋“  MongoDB Atlas ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ช…๋ น์— ๋Œ€ํ•œ Atlas ์ง€์›์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ช…๋ น์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • MongoDB Enterprise: MongoDB์˜ ๊ตฌ๋… ๊ธฐ๋ฐ˜ ์ž์ฒด ๊ด€๋ฆฌ ๋ฒ„์ „

  • MongoDB Community: MongoDB์˜ ์†Œ์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฌด๋ฃŒ ์ž์ฒด ๊ด€๋ฆฌ ๋ฒ„์ „

Stable API V1์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

  • options ๋ฌธ์„œ์—๋Š” ๋‹ค์Œ ํ•„๋“œ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • background

    • bucketSize

    • sparse

    • storageEngine

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

  • ์œ„์˜ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค ์œ ํ˜•์€ ์—„๊ฒฉ ๋ชจ๋“œ ์—์„œ ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ ์— ์˜ํ•ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ์˜ˆ์‹œ sparse ์ธ๋ฑ์Šค ๋ฅผ cursor.hint() ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ BadValue ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    planner returned error :: caused by :: hint provided does not
    correspond to an existing index

options ๋ฌธ์„œ์—๋Š” ์ธ๋ฑ์Šค ์ƒ์„ฑ์„ ์ œ์–ดํ•˜๋Š” ์˜ต์…˜ ์ง‘ํ•ฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์œ ํ˜•์— ๋”ฐ๋ผ ํ•ด๋‹น ์œ ํ˜•์— ๋งž๋Š” ์ถ”๊ฐ€ ์˜ต์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์„œ์— ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ์˜ต์…˜ ๋ฌธ์„œ๋ฅผ ์ง€์ •ํ•˜๋ฉด db.collection.createIndexes() ์ž‘์—…์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ db.collection.createIndexes() ์—ฐ์‚ฐ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.

db.collection.createIndexes(
[
{
"a": 1
},
{
"b": 1
}
],
{
unique: true,
sparse: true,
expireAfterSeconds: 3600
}
)

์˜ต์…˜ ์‚ฌ์–‘์ด ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋กœ ๋ถ„ํ• ๋œ ๊ฒฝ์šฐ(์˜ˆ: { unique: true }, { sparse: true, expireAfterSeconds: 3600 }) ์ธ๋ฑ์Šค ์ƒ์„ฑ ์ž‘์—…์€ ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ค‘์š”

์˜ต์…˜์„ db.collection.createIndexes()๋กœ ์ง€์ •ํ•˜๋ฉด ์ง€์ •๋œ ๋ชจ๋“  ์ธ๋ฑ์Šค์— ์˜ต์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์ •๋ ฌ ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ฉด ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ธ๋ฑ์Šค์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

db.collection.createIndexes() ์€(๋Š”) ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์˜ต์…˜์ด๋‚˜ ์ธ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ต์…˜ ์„ค๋ช…์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ต์…˜์€ ๋‹ฌ๋ฆฌ ์ง€์ •๋˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ์ธ๋ฑ์Šค ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
unique
๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. keyPatterns ๋ฐฐ์—ด์— ์ง€์ •๋œ ๊ฐ ์ธ๋ฑ์Šค๊ฐ€ ๊ณ ์œ  ์ธ๋ฑ์Šค์ž„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์œ  ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด ์ธ๋ฑ์Šค์˜ ๊ธฐ์กด ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์˜ ์‚ฝ์ž…์ด๋‚˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ ์œ  ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด true๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

ํ•ด์‹œ๋œ ์ธ๋ฑ์Šค์—๋Š” ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

name
๋ฌธ์ž์—ด

์„ ํƒ ์‚ฌํ•ญ. ์ธ๋ฑ์Šค์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ MongoDB๋Š” ์ธ๋ฑ์‹ฑ๋œ ํ•„๋“œ์˜ ์ด๋ฆ„๊ณผ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ธ๋ฑ์Šค ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.collection.createIndexes()์— ์ง€์ •๋œ ์˜ต์…˜์€ ํ‚ค ํŒจํ„ด ๋ฐฐ์—ด์— ํฌํ•จ๋œ ๋ชจ๋“  ์ธ๋ฑ์Šค ์‚ฌ์–‘์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ db.collection.createIndexes()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

partialFilterExpression
๋ฌธ์„œ

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

ํ•„ํ„ฐ ํ‘œํ˜„์‹์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋“ฑ์‹ ํ‘œํ˜„์‹(์˜ˆ field: value ๋˜๋Š” $eq ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ),

  • $exists: true ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค,

  • $gt, $gte, $lt, $lte expressions,

  • $type ํ‘œํ˜„์‹,

  • $and ์—ฐ์‚ฐ์ž

  • $or ์—ฐ์‚ฐ์ž

  • $in ์—ฐ์‚ฐ์ž

๋ชจ๋“  MongoDB ์ธ๋ฑ์Šค ์œ ํ˜•์— partialFilterExpression ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sparse
๋ถ€์šธ

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

๋‹ค์Œ ์ธ๋ฑ์Šค ์œ ํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌ๋ฐ•ํ•˜๋ฉฐ ์ด ์˜ต์…˜์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

2dsphere ์ธ๋ฑ์Šค ํ‚ค์™€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ‚ค๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณตํ•ฉ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ 2dsphere ์ธ๋ฑ์Šค ํ•„๋“œ๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ์ธ๋ฑ์Šค๋Š” sparse index ๊ธฐ๋Šฅ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†๋Š” ๊ฒฝ์šฐ sparse index ๋Œ€์‹  ๋ถ€๋ถ„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

expireAfterSeconds
integer

์„ ํƒ ์‚ฌํ•ญ. MongoDB๊ฐ€ ์ด ์ปฌ๋ ‰์…˜์— ๋ฌธ์„œ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ธฐ๊ฐ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด TTL(Time To Live)๋กœ ์ดˆ ๋‹จ์œ„์˜ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ TTL ์ธ๋ฑ์Šค์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ TTL์„ ์„ค์ •ํ•˜์—ฌ ์ปฌ๋ ‰์…˜์—์„œ ๋ฐ์ดํ„ฐ ๋งŒ๋ฃŒํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 5.0 ์ด์ „์— ์ƒ์„ฑ๋œ TTL ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ MongDB 5.0์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ 5.0 ์ด์ „ ์„ค์น˜์™€ ๋™๊ธฐํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด NaN์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋œ ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

TTL ์ธ๋ฑ์Šค expireAfterSeconds ๊ฐ’์€ 0 ๊ณผ 2147483647 ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ˆจ๊ธธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ ์ธ๋ฑ์Šค๋Š” ์ฟผ๋ฆฌ ๊ณ„ํš ์„ ํƒ์˜ ์ผ๋ถ€๋กœ ํ‰๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

storageEngine
๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

storageEngine ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

storageEngine: { <storage-engine-name>: <options> }

์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ง€์ •ํ•œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ตฌ์„ฑ ์˜ต์…˜์€ ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์ œ ์ค‘์— ์œ ํšจ์„ฑ์ด ๊ฒ€์‚ฌ๋˜๊ณ  oplog์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
collation
๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์†Œ๋ฌธ์ž ๋ฐ ์•…์„ผํŠธ ํ‘œ์‹œ ๊ทœ์น™๊ณผ ๊ฐ™์€ ๋ฌธ์ž์—ด ๋น„๊ต์— ๋Œ€ํ•œ ์–ธ์–ด๋ณ„ ๊ทœ์น™์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

collection ์ˆ˜์ค€์—์„œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ:

  • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด MongoDB๋Š” collection์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜๋ฉด MongoDB๋Š” ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ •๋ ฌ ์˜ต์…˜์˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•  ๋•Œ locale ํ•„๋“œ๋Š” ํ•„์ˆ˜์ด๊ณ , ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ํ•„๋“œ๋Š” ๋ชจ๋‘ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ•„๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์ธ๋ฑ์Šค๋Š” ๋‹จ์ˆœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋น„๊ต๋งŒ ์ง€์›ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒ

๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์•„๋‹Œ ์ปฌ๋ ‰์…˜์— text ๋˜๋Š” 2d ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ {collation: {locale: "simple"} }๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

collection ์ˆ˜์ค€์—์„œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ:

  • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด MongoDB๋Š” collection์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜๋ฉด MongoDB๋Š” ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํŒ

1 ๋˜๋Š” 2์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ strength๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ strength๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธ๋ฑ์Šค๋Š” ๋ฐœ์Œ ๊ตฌ๋ณ„ ๋ถ€ํ˜ธ์™€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ํ‚ค์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค ํŒจํ„ด์€ ๊ฐ™์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ๋‹ค๋ฅธ ๊ณ ์œ ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๊ณ ์œ ํ•œ ์ธ๋ฑ์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๋น„๊ต์— ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ž‘์—…์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์—…์—์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์žˆ๋Š” ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์‹ฑ๋œ ํ•„๋“œ์—์„œ ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

๋ฐ์ดํ„ฐ ์ •๋ ฌ๋กœ ๊ตฌ์„ฑ๋œ ์ธ๋ฑ์Šค๋Š” ICU ๋ฐ์ดํ„ฐ ์ •๋ ฌ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์—†๋Š” ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ์ธ์‹ ์ธ๋ฑ์Šค ํ‚ค๊ฐ€ ์ธ๋ฑ์Šค ํ‚ค๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ปฌ๋ ‰์…˜ myColl์—๋Š” ๋Œ€์กฐ ๊ตญ๊ฐ€ ๋ฐ ์–ธ์–ด ์„ค์ •์ด "fr" ์ธ ๋ฌธ์ž์—ด ํ•„๋“œ category์— ๋Œ€ํ•œ ์ƒ‰์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

์ธ๋ฑ์Šค์™€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ ์ž‘์—…์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ '๋‹จ์ˆœ' ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ •๋ ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ ์ž‘์—…์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

db.myColl.find( { category: "cafe" } )

์ธ๋ฑ์Šค ์ ‘๋‘์‚ฌ ํ‚ค๊ฐ€ ๋ฌธ์ž์—ด, ๋ฐฐ์—ด ๋ฐ ๋‚ด์žฅ๋œ ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜๋Š” ์ž‘์—…์—์„œ๋„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค ์ ‘๋‘์‚ฌ ํ‚ค์— ๋Œ€ํ•œ ๋น„๊ต๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ปฌ๋ ‰์…˜ myColl์—๋Š” ์ˆซ์ž ํ•„๋“œ score ๋ฐ price์™€ ๋ฌธ์ž์—ด ํ•„๋“œ category์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์ •๋ ฌ ๊ตญ๊ฐ€ ๋ฐ ์–ธ์–ด ์„ค์ • "fr"์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )

๋ฌธ์ž์—ด ๋น„๊ต์— "simple" ์ด์ง„ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ ์ž‘์—…์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

์ƒ‰์ธ์ด ์ƒ์„ฑ๋œ category ํ•„๋“œ์˜ ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์œ„ํ•ด "simple" ์ด์ง„ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ ์ž‘์—…์€ ์ƒ‰์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ์˜ score: 5 ๋ถ€๋ถ„๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.myColl.find( { score: 5, category: "cafe" } )

์ค‘์š”

๋‚ด์žฅ๋œ ๋ฌธ์„œ ํ‚ค๋ฅผ ๋น„๋กฏํ•œ ๋ฌธ์„œ ํ‚ค์™€์˜ ์ผ์น˜๋Š” ๋‹จ์ˆœ ์ด์ง„ ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "foo.bรกr"์™€ ๊ฐ™์€ ํ‚ค์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋Š” "foo.bar" ํ‚ค์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ•๋„ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์„ค์ •ํ•œ ๊ฐ’์— ๊ด€๊ณ„์—†์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ต์…˜์€ ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
weights
๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ํ•„๋“œ ๋ฐ ๊ฐ€์ค‘์น˜ ์Œ์„ ํฌํ•จํ•˜๋Š” ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๋Š” 1~99,999 ๋ฒ”์œ„์˜ ์ •์ˆ˜์ด๋ฉฐ, ์ธ๋ฑ์‹ฑ๋œ ๋‹ค๋ฅธ ํ•„๋“œ์— ๋Œ€ํ•œ ํ•ด๋‹น ํ•„๋“œ์˜ ์ค‘์š”๋„๋ฅผ ์ ์ˆ˜ ์ธก๋ฉด์—์„œ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ธ๋ฑ์‹ฑ๋œ ์ผ๋ถ€ ํ•„๋“œ ๋˜๋Š” ๋ชจ๋“  ํ•„๋“œ์— ๊ฐ€์ค‘์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋ ค๋ฉด ์ž์ฒด ๊ด€๋ฆฌํ˜• ๋ฐฐํฌ์—์„œ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ๊ฐ€์ค‘์น˜ ํ• ๋‹นํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

MongoDB 5.0๋ถ€ํ„ฐ ๊ฐ€์ค‘์น˜ ์˜ต์…˜์€ ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

default_language
๋ฌธ์ž์—ด
์„ ํƒ ์‚ฌํ•ญ. ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ์ด ์–ธ์–ด๋Š” ์ค‘์ง€ ๋‹จ์–ด ๋ชฉ๋ก๊ณผ ์–ด๊ฐ„ ๋ฐ ํ† ํฌ๋‚˜์ด์ €์— ๋Œ€ํ•œ ๊ทœ์น™์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ์‹œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด์— ๋Œ€ํ•œ ์ž์ฒด ๊ด€๋ฆฌํ˜• ๋ฐฐํฌ์˜ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ์–ธ์–ด ๋ฐ ์ž์ฒด ๊ด€๋ฆฌํ˜• ๋ฐฐํฌ์˜ ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์–ธ์–ด ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ english์ž…๋‹ˆ๋‹ค.
language_override
๋ฌธ์ž์—ด
์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์—์„œ ์ปฌ๋ ‰์…˜ ๋ฌธ์„œ์˜ ํ•„๋“œ ์ด๋ฆ„์œผ๋กœ, ๋ฌธ์„œ์˜ ์žฌ์ •์˜ ์–ธ์–ด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ language์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ์ž์ฒด ๊ด€๋ฆฌ ๋ฐฐํฌ์—์„œ ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์˜ ๊ธฐ๋ณธ ์–ธ์–ด ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.
textIndexVersion
integer

์„ ํƒ ์‚ฌํ•ญ. text ์ธ๋ฑ์Šค ๋ฒ„์ „ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ ์˜ต์…˜์€ 2Ddsphere ์ธ๋ฑ์Šค์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
2dsphereIndexVersion
integer

์„ ํƒ ์‚ฌํ•ญ. 2dsphere ์ธ๋ฑ์Šค ๋ฒ„์ „ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์€ 2dsphere ์ธ๋ฑ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ต์…˜์€ 2d ์ธ๋ฑ์Šค์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
bits
integer

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. 2d ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ์œ„์น˜ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ๋œ geohash ๊ฐ’์˜ ์ •๋ฐ€๋„ ์ˆ˜์ž…๋‹ˆ๋‹ค.

bits ๊ฐ’์˜ ๋ฒ”์œ„๋Š” 1์—์„œ 32๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 26์ž…๋‹ˆ๋‹ค.

min
์ˆซ์ž
์„ ํƒ ์‚ฌํ•ญ. 2d ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ๊ฒฝ๋„ ๋ฐ ์œ„๋„ ๊ฐ’์˜ ํ•˜ํ•œ ํฌํ•จ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ -180.0์ž…๋‹ˆ๋‹ค.
max
์ˆซ์ž
์„ ํƒ ์‚ฌํ•ญ. 2d ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ๊ฒฝ๋„ ๋ฐ ์œ„๋„ ๊ฐ’์˜ ์ƒ์œ„ ํฌํ•จ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 180.0์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ต์…˜์€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Parameter
์œ ํ˜•
์„ค๋ช…
wildcardProjection
๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์—์„œ ํŠน์ • ํ•„๋“œ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

wildcardProjection ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์–‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

{ "$**": 1 }
{ "userID":, "$**": 1 }

๊ทธ๋Ÿฌ๋‚˜ ์™€์ผ๋“œ์นด๋“œ ํ•„๋“œ์™€ ์ผ๋ฐ˜(์™€์ผ๋“œ์นด๋“œ๊ฐ€ ์•„๋‹Œ) ํ•„๋“œ์— ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ธ๋ฑ์Šค๋Š” ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜ํ•˜๋ ค๋ฉด wildcardProjection์„ ์‚ฌ์šฉํ•˜์—ฌ ์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด์—์„œ ์ค‘๋ณต๋œ ํ•„๋“œ๋ฅผ ์ œ์™ธํ•˜์„ธ์š”.

wildcardProjection ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์–‘์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

``{ "path.to.field.$**" : 1 }``

wildcardProjection ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

wildcardProjection: {
"path.to.field.a" : <value>,
"path.to.field.b" : <value>
}

<value> ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • 0 ๋˜๋Š” false๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์—์„œ ํ•„๋“œ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

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

{
"wildcardProjection" : {
"_id" : 1,
"<field>" : 0|1
}
}

wildcardProjection ๋ฌธ์„œ์˜ ๋ชจ๋“  ๋ช…๋ น๋ฌธ์€ ํฌํ•จ๋ฌธ ๋˜๋Š” ์ œ์™ธ๋ฌธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ์™ธ๋ฌธ๊ณผ ํ•จ๊ป˜ _id ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทœ์น™์˜ ์œ ์ผํ•œ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

db.collection.createIndexes()์— ์ง€์ •๋œ ์˜ต์…˜์€ ํ‚ค ํŒจํ„ด ๋ฐฐ์—ด์— ํฌํ•จ๋œ ๋ชจ๋“  ์ธ๋ฑ์Šค ์‚ฌ์–‘์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. db.collection.createIndexes()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ wildcardProjection์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด db.collection.createIndexes()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด MongoDB๋Š” ๊ธฐ์กด ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ •๋ ฌ ์˜ต์…˜์„ ์ œ์™ธํ•˜๊ณ , ํ•œ ์„ธํŠธ์˜ ์ธ๋ฑ์Šค ์˜ต์…˜์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ์ธ๋ฑ์Šค ์˜ต์…˜์œผ๋กœ ๋™์ผํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด MongoDB๋Š” ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ˆจ๊น€ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ˆจ๊น€ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค๋ฅธ ์ธ๋ฑ์Šค ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๊ธฐ์กด ์ธ๋ฑ์Šค๋ฅผ db.collection.dropIndex()๋กœ ์ œ๊ฑฐํ•œ ํ›„ ์ƒˆ ์˜ต์…˜์œผ๋กœ db.collection.createIndexes()๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

๋™์ผํ•œ ํ‚ค์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค ํŒจํ„ด์€ ๊ฐ™์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ๋‹ค๋ฅธ ๊ณ ์œ ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๊ณ ์œ ํ•œ ์ธ๋ฑ์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ์ธ๋ฑ์Šค๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์ˆจ๊น€ ํ•ด์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ mongosh ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

  • ์ธ๋ฑ์Šค์˜ hidden ์˜ต์…˜์„ true(์œผ)๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด db.collection.hideIndex() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    db.restaurants.hideIndex( { borough: 1, ratings: 1 } );
  • ์ธ๋ฑ์Šค์˜ hidden ์˜ต์…˜์„ false(์œผ)๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด db.collection.unhideIndex() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    db.restaurants.unhideIndex( { borough: 1, city: 1 } );

ํŒ

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

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

    {
    "wildcardProjection" : {
    "_id" : 1,
    "<field>" : 0|1
    }
    }

    wildcardProjection ๋ฌธ์„œ์˜ ๋ชจ๋“  ๋ช…๋ น๋ฌธ์€ ํฌํ•จ๋ฌธ ๋˜๋Š” ์ œ์™ธ๋ฌธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ์™ธ๋ฌธ๊ณผ ํ•จ๊ป˜ _id ํ•„๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทœ์น™์˜ ์œ ์ผํ•œ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

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

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

    MongoDB 7.0๋ถ€ํ„ฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ(1) ๋ฐ ๋‚ด๋ฆผ์ฐจ์ˆœ(-1) ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ๋งŒ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŠธ๋žœ์žญ์…˜์ด ๊ต์ฐจ ์ƒค๋“œ ์“ฐ๊ธฐ ํŠธ๋žœ์žญ์…˜(write transaction)์ธ ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ปฌ๋ ‰์…˜๊ณผ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์—์„œ db.collection.createIndexes()๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ธฐ ๊ณ ๋ ค "local"๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "local" ์ด์™ธ์˜ ์ฝ๊ธฐ ๊ณ ๋ ค ์ˆ˜์ค€์„ ์ง€์ •ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํŒ

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

db.collection.createIndex() ๋‹ค์–‘ํ•œ ์ธ๋ฑ์Šค ์‚ฌ์–‘์˜ ์˜ˆ์‹œ

๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ restaurants collection์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{
location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
},
name: "Morris Park Bake Shop",
cuisine: "Cafe",
borough: "Bronx",
}

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” restaurants ์ปฌ๋ ‰์…˜์— ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค, ์ฆ‰ borough ํ•„๋“œ์— ์˜ค๋ฆ„์ฐจ์ˆœ ์ธ๋ฑ์Šค์™€ location ํ•„๋“œ์— 2dsphere ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.restaurants.createIndexes([{"borough": 1}, {"location": "2dsphere"}])

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” products collection์— ๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค, ์ฆ‰ manufacturer ํ•„๋“œ ๊ธฐ์ค€์˜ ์˜ค๋ฆ„์ฐจ์ˆœ ์ธ๋ฑ์Šค์™€ category ํ•„๋“œ ๊ธฐ์ค€์˜ ์˜ค๋ฆ„์ฐจ์ˆœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ธ๋ฑ์Šค ๋ชจ๋‘ ๊ตญ๊ฐ€ ๋ฐ ์–ธ์–ด ์„ค์ • fr ๋ฐ ๋น„๊ต ๊ฐ•๋„ 2๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

db.products.createIndexes( [ { "manufacturer": 1}, { "category": 1 } ],
{ collation: { locale: "fr", strength: 2 } })

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

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

๋‹ค์Œ์€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค ์ƒ์„ฑ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

db.products_catalog.insertMany( [
{
_id : ObjectId("5c1d358bf383fbee028aea0b"),
product_name: "Blaster Gauntlet",
product_attributes: {
price: {
cost: 299.99,
currency: "USD"
}
}
},
{
_id: ObjectId("5c1d358bf383fbee028aea0c"),
product_name: "Super Suit",
product_attributes: {
superFlight: true,
resistance: [ "Bludgeoning", "Piercing", "Slashing" ]
}
}
] )

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

use inventory
db.products_catalog.createIndexes(
[ { "product_attributes.$**" : 1 } ]
)

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

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

db.products_catalog.find( { "product_attributes.superFlight" : true } )
db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt : 20 } } )
db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )

์ฐธ๊ณ 

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

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

db.products_catalog.insertMany( [
{
_id : ObjectId("5c1d358bf383fbee028aea0b"),
product_name: "Blaster Gauntlet",
product_attributes: {
price: {
cost: 299.99,
currency: "USD"
}
}
},
{
_id: ObjectId("5c1d358bf383fbee028aea0c"),
product_name: "Super Suit",
product_attributes: {
superFlight: true,
resistance: [ "Bludgeoning", "Piercing", "Slashing" ]
}
}
] )

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

use inventory
db.products_catalog.createIndexes( [ { "$**" : 1 } ] )

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

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

db.products_catalog.find( { "product_price" : { $lt : 25 } } )
db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )

์ฐธ๊ณ 

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

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

db.products_catalog.insertMany( [
{
_id : ObjectId("5c1d358bf383fbee028aea0b"),
product_name: "Blaster Gauntlet",
product_attributes: {
price: {
cost: 299.99,
currency: "USD"
}
}
},
{
_id: ObjectId("5c1d358bf383fbee028aea0c"),
product_name: "Super Suit",
product_attributes: {
superFlight: true,
resistance: [ "Bludgeoning", "Piercing", "Slashing" ]
}
}
] )

๋‹ค์Œ ์ž‘์—…์€ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์„ ์ƒ์„ฑํ•˜๊ณ  wildcardProjection ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค์— product_attributes.elements ๋ฐ product_attributes.resistance ํ•„๋“œ์˜ ์Šค์นผ๋ผ ๊ฐ’๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

use inventory
db.products_catalog.createIndexes(
[ { "$**" : 1 } ],
{
"wildcardProjection" : {
"product_attributes.elements" : 1,
"product_attributes.resistance" : 1
}
}
)

"$**" ํŒจํ„ด์€ ๋ฌธ์„œ์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. wildcardProjection ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •๋œ ํ•„๋“œ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

wildcardProjection์— ๋Œ€ํ•œ ์ „์ฒด ๋ฌธ์„œ๋Š” wildcard ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•„๋“œ๊ฐ€ ์ค‘์ฒฉ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฌธ์„œ/๋ฐฐ์—ด๋กœ ๋ฐ˜๋ณต๋˜์–ด ๋ฌธ์„œ/๋ฐฐ์—ด์˜ ๋ชจ๋“  ์Šค์นผ๋ผ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

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

db.products_catalog.find( { "product_attributes.elements" : { $eq: "Water" } } )
db.products_catalog.find( { "product_attributes.resistance" : "Bludgeoning" } )

์ฐธ๊ณ 

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

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

db.products_catalog.insertMany( [
{
_id : ObjectId("5c1d358bf383fbee028aea0b"),
product_name: "Blaster Gauntlet",
product_attributes: {
price: {
cost: 299.99,
currency: "USD"
}
}
},
{
_id: ObjectId("5c1d358bf383fbee028aea0c"),
product_name: "Super Suit",
product_attributes: {
superFlight: true,
resistance: [ "Bludgeoning", "Piercing", "Slashing" ]
}
}
] )

์ด ์˜ˆ์‹œ์—์„œ๋Š” ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค์™€ wildcardProjection ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ์ปฌ๋ ‰์…˜์— ํฌํ•จ๋œ ๊ฐ ๋ฌธ์„œ์˜ ์Šค์นผ๋ผ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” product_attributes.elements ๋ฐ product_attributes.resistance ํ•„๋“œ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค:

use inventory
db.products_catalog.createIndexes(
[ { "$**" : 1 } ],
{
"wildcardProjection" : {
"product_attributes.elements" : 0,
"product_attributes.resistance" : 0
}
}
)

์™€์ผ๋“œ์นด๋“œ ํŒจํ„ด "$**"์—๋Š” ๋ฌธ์„œ์˜ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ wildcardProjection ํ•„๋“œ๋Š” ์ง€์ •๋œ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์Šค์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

wildcardProjection์— ๋Œ€ํ•œ ์ „์ฒด ๋ฌธ์„œ๋Š” wildcard ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•„๋“œ๊ฐ€ ์ค‘์ฒฉ๋œ ๋ฌธ์„œ ๋˜๋Š” ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ ์ธ๋ฑ์Šค๋Š” ๋ฌธ์„œ/๋ฐฐ์—ด๋กœ ๋ฐ˜๋ณต๋˜์–ด ๋ฌธ์„œ/๋ฐฐ์—ด์˜ ๋ชจ๋“  ์Šค์นผ๋ผ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

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

db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt: 25 } } )
db.products_catalog.find( { "product_attributes.superStrength" : true } )

์ฐธ๊ณ 

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

์ฐธ๊ณ 

featureCompatibilityVersion 4.4 ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ mongod ์„ธํŠธ ๋˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ 4.4 ์—๋Š” ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„ ๊ฐ„์— ์ธ๋ฑ์Šค ๋นŒ๋“œ๋ฅผ ๋™์‹œ์— ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก featureCompatibilityVersion ์ด ์ด์ƒ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

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

์ฟผ๋Ÿผ ์ปค๋ฐ‹์„ ์„ค์ •ํ•˜๋ ค๋ฉด createIndexes()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ commitQuorum ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

commitQuorum ์€ ์ธ๋ฑ์Šค ๋นŒ๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ธฐ ์œ„ํ•ด ์ค€๋น„ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ณด์œ  ํˆฌํ‘œ ๋ฉค๋ฒ„์˜ ์ˆ˜ ๋˜๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ํˆฌํ‘œ ๋ฉค๋ฒ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ๊ฐ€ ์ปค๋ฐ‹์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ฟผ๋Ÿผ ์ปค๋ฐ‹์€ votingMembers์ด๋ฉฐ, ์ด๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณด์œ  ๋ฉค๋ฒ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์—ฐ์‚ฐ์€ ์ฟผ๋Ÿผ ์ปค๋ฐ‹์ด "majority"์ธ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.getSiblingDB("examples").invoices.createIndexes(
{ "invoices" : 1 },
{ },
"majority"
)

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

์บ˜๋ฆฌํฌ๋‹ˆ์•„์ฃผ(CA)์™€ ์›Œ์‹ฑํ„ด์ฃผ(WA)์˜ ์ผ€์ดํฌ ํŒ๋งค๋Ÿ‰์ด ํฌํ•จ๋œ cakeSales collection์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.cakeSales.insertMany( [
{ _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),
state: "CA", price: 13, quantity: 120 },
{ _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),
state: "WA", price: 14, quantity: 140 },
{ _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),
state: "CA", price: 12, quantity: 145 },
{ _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),
state: "WA", price: 13, quantity: 104 },
{ _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),
state: "CA", price: 41, quantity: 162 },
{ _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),
state: "WA", price: 43, quantity: 134 }
] )

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” cakeSales ์ปฌ๋ ‰์…˜์— ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

db.cakeSales.createIndexes( [
{ "type": 1 },
{ "orderDate": 1 },
{ "state": 1 },
{ "orderDate": 1, "state": -1 }
] )

์ฒ˜์Œ ์„ธ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋Š” ๋‹จ์ผ ํ•„๋“œ์— ์žˆ์œผ๋ฉฐ ์˜ค๋ฆ„์ฐจ์ˆœ(1)์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋Š” orderDate์— ์˜ค๋ฆ„์ฐจ์ˆœ(1), state์— ๋‚ด๋ฆผ์ฐจ์ˆœ(-1)์œผ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

db.collection.createIndex