Docs Menu

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ •๋ ฌํ•˜๊ธฐ

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

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

MongoDB์—์„œ 100 ์ฐจ๋‹จ ์ •๋ ฌ ์ž‘์—…์— ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ์ด์ƒ์˜ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ์—์„œ ๋ฅผ cursor.allowDiskUse() ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ MongoDB์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. allowDiskUse() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด MongoDB๊ฐ€ ๋””์Šคํฌ์˜ ์ž„์‹œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋‹จ ์ •๋ ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ 100 ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ ฌ ์ž‘์—…์€ ์ฐจ๋‹จ ์ •๋ ฌ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์ข‹์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

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

  • ๋ชจ๋“  ์ •๋ ฌ ํ•„๋“œ์˜ ์ธ๋ฑ์Šค ๊ฒฝ๊ณ„ ๋Š” [MinKey, MaxKey] ์ด๋ฉฐ ,

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

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

์˜ˆ๋ฅผ ๋“ค์–ด, records ์ปฌ๋ ‰์…˜์˜ a ํ•„๋“œ์— ์˜ค๋ฆ„์ฐจ์ˆœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.records.createIndex( { a: 1 } )

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

db.records.find().sort( { a: 1 } )

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

db.records.find().sort( { a: -1 } )

๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ•„๋“œ์—์„œ ์ •๋ ฌ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค์˜ ๋ชจ๋“  ํ‚ค ๋˜๋Š” ์„œ๋ธŒ์„ธํŠธ์— ๋Œ€ํ•ด ์ •๋ ฌ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ •๋ ฌ ํ‚ค๋Š” ์ธ๋ฑ์Šค์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ˆœ์„œ ๋กœ ๋‚˜์—ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๋ฑ์Šค ํ‚ค ํŒจํ„ด { a: 1, b: 1 }์€ { a: 1, b: 1 }์˜ ์ •๋ ฌ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ { b: 1, a: 1 }์˜ ์ •๋ ฌ์€ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๊ฐ€ ์ •๋ ฌ์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด cursor.sort() ๋ฌธ์„œ์˜ ๋ชจ๋“  ํ‚ค์— ์ง€์ •๋œ ์ •๋ ฌ ๋ฐฉํ–ฅ์ด ์ธ๋ฑ์Šค ํ‚ค ํŒจํ„ด ๋˜๋Š” ๊ทธ ์—ญ๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ๋ฑ์Šค ํ‚ค ํŒจํ„ด { a: 1, b: -1 }์€ { a: 1, b: -1 } ๋ฐ { a: -1, b: 1 }์˜ ์ •๋ ฌ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ { a: -1, b: -1 } ๋˜๋Š” {a: 1, b: 1}์˜ ์ •๋ ฌ์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด data ์ปฌ๋ ‰์…˜์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.data.createIndex( { a:1, b: 1, c: 1, d: 1 } )

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ์ธ๋ฑ์Šค์˜ ์ ‘๋‘์‚ฌ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

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

์˜ˆ์‹œ
Index Prefix

db.data.find().sort( { a: 1 } )

{ a: 1 }

db.data.find().sort( { a: -1 } )

{ a: 1 }

db.data.find().sort( { a: 1, b: 1 } )

{ a: 1, b: 1 }

db.data.find().sort( { a: -1, b: -1 } )

{ a: 1, b: 1 }

db.data.find().sort( { a: 1, b: 1, c: 1 } )

{ a: 1, b: 1, c: 1 }

db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )

{ a: 1, b: 1 }

์ธ๋ฑ์Šค์˜ ์ ‘๋‘์‚ฌ ํ‚ค๊ฐ€ ์ฟผ๋ฆฌ ์ˆ ์–ด์™€ ์ •๋ ฌ ๋ชจ๋‘์— ๋‚˜ํƒ€๋‚˜๋Š” ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )

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

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

์˜ˆ๋ฅผ ๋“ค์–ด data ์ปฌ๋ ‰์…˜์˜ ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{ a: 1, b: 1, c: 1, d: 1 }

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

์˜ˆ์‹œ
Index Prefix

db.data.find( { a: 5 } ).sort( { b: 1, c: 1 } )

{ a: 1 , b: 1, c: 1 }

db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } )

{ a: 1, b: 1, c: 1 }

db.data.find( { a: 5, b: { $lt: 3} } ).sort( { b: 1 } )

{ a: 1, b: 1 }

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

์ฟผ๋ฆฌ๊ฐ€ ์ •๋ ฌ ์‚ฌ์–‘ ์•ž์— ์˜ค๊ฑฐ๋‚˜ ๊ฒน์น˜๋Š” ์ธ๋ฑ์Šค ์ ‘๋‘์‚ฌ์— ๋™๋“ฑ์„ฑ ์กฐ๊ฑด์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—…์—์„œ ์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ž‘์—…์€ { c: 1 }์˜ ์ •๋ ฌ ๋ฌธ์„œ๋ฅผ ์ง€์ •ํ•˜์ง€๋งŒ ์ฟผ๋ฆฌ ๋ฌธ์„œ๋Š” ์„ ํ–‰ ์ธ๋ฑ์Šค ํ•„๋“œ a ๋ฐ b์˜ ๋™๋“ฑ์„ฑ ๋งค์น˜๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

db.data.find( { a: { $gt: 2 } } ).sort( { c: 1 } )
db.data.find( { c: 5 } ).sort( { c: 1 } )

์ด๋Ÿฌํ•œ ์ž‘์—…์€ { a: 1, b: 1, c: 1, d: 1 } ์ธ๋ฑ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฌธ์„œ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๋œ ๋ฌธ์„œ ๋ชจ์Œ์€ ํ‚ค ํ•„๋“œ์— ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค์— ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฐ€์ง„ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋Š” BSON ์œ ํ˜• ์ •๋ ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐ์—ด ๋น„๊ต์—์„œ

    • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์€ BSON ์œ ํ˜• ์ •๋ ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐฐ์—ด ์˜ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    • ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์€ BSON ์œ ํ˜•์˜ ์—ญ์ˆœ ์ •๋ ฌ์— ๋”ฐ๋ผ ๋ฐฐ์—ด ์˜ ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฐ ๊ณผ $lt๊ฐ™์€ ๋น„๊ต $gt ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ์‚ฌ์ „์ˆœ์œผ๋กœ ๋ฐฐ์—ด์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐ’์ด ํ•œ ์š”์†Œ ๋ฐฐ์—ด ( ์˜ˆ์‹œ : [ 1 ])์ธ ํ•„๋“œ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•„๋“œ( ์˜ˆ์‹œ: 2)์™€ ๋น„๊ตํ•  ๋•Œ ๋น„๊ต๋Š” 1 ๋ฐ 2์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๋นˆ ๋ฐฐ์—ด ( ์˜ˆ์‹œ: [ ])์„ ๋น„๊ตํ•˜๋ฉด ๋นˆ ๋ฐฐ์—ด ์ด null ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ํ•„๋“œ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

    • ์ค‘์ฒฉ๋œ ๋ฐฐ์—ด ์˜ ๋น„๊ต( ์˜ˆ์‹œ : [[1, 2], [3, 4]])๋Š” ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ๋ฐฐ์—ด ์ดํ›„์˜ ๋ชจ๋“  ๋ฐฐ์—ด ์‚ฌ์ „์ˆœ์œผ๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ์ •๋ ฌ ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

๊ฒฝ๊ณ 

๋ฐ์ดํ„ฐ ์ •๋ ฌ๋กœ ๊ตฌ์„ฑ๋œ ์ธ๋ฑ์Šค๋Š” 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" ํ‚ค์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ•๋„ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์„ค์ •ํ•œ ๊ฐ’์— ๊ด€๊ณ„์—†์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ธ๋ฑ์Šค ํ‚ค์˜ ์œ ํ˜•์ด ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์˜ ์ •๋ ฌ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

keyTypes ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.keyTypes.insertMany( [
{ seqNum: 1, seqType: null, type: "null" },
{ seqNum: 29, seqType: null, type: "null" },
{ seqNum: 2, seqType: Int32("10"), type: "Int32" },
{ seqNum: 28, seqType: Int32("10"), type: "Int32" },
{ seqNum: 3, seqType: Long("10"), type: "Long" },
{ seqNum: 27, seqType: Long("10"), type: "Long" },
{ seqNum: 4, seqType: Decimal128("10"), type: "Decimal128" },
{ seqNum: 26, seqType: Decimal128("10"), type: "Decimal128" },
{ seqNum: 5, seqType: Double("10"), type: "Double" },
{ seqNum: 25, seqType: Double("10"), type: "Double" },
{ seqNum: 6, seqType: String("10"), type: "String" },
{ seqNum: 24, seqType: String("10"), type: "String" },
{ seqNum: 7, seqType: [ "1", "2", "3" ], type: "Array" },
{ seqNum: 23, seqType: [ "1", "2", "3" ], type: "Array" },
{ seqNum: 8, seqType: [ [1], [2], [3] ], type: "Array" },
{ seqNum: 22, seqType: [ [1], [2], [3] ], type: "Array " },
{ seqNum: 9, seqType: [ 1, 2, 3 ], type: "Array" },
{ seqNum: 21, seqType: [ 1, 2, 3 ], type: "Array" },
{ seqNum: 10, seqType: true, type: "Boolean" },
{ seqNum: 11, seqType: new Timestamp(), type: "Timestamp" },
{ seqNum: 12, seqType: new Date(), type: "Date" },
{ seqNum: 13, seqType: new ObjectId(), type: "ObjectId" },
] )

์‹œํ€€์Šค ๋ฒˆํ˜ธ(seqNum) ๋ฐ ์œ ํ˜•(seqType) ํ•„๋“œ์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.keyTypes.createIndex( { seqNum: 1 } )
db.keyTypes.createIndex( { seqType: 1 } )

find()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ๋ฌธ์„œ{ _id: 0 }๋Š” ์ถœ๋ ฅ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ _id ํ•„๋“œ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

db.keyTypes.find( {}, { _id: 0 } )

๋ฌธ์„œ๊ฐ€ ์‚ฝ์ž…๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{ seqNum: 1, seqType: null, type: 'null' },
{ seqNum: 29, seqType: null, type: 'null' },
{ seqNum: 2, seqType: 10, type: 'Int32' },
{ seqNum: 28, seqType: 10, type: 'Int32' },
{ seqNum: 3, seqType: Long("10"), type: 'Long' },
{ seqNum: 27, seqType: Long("10"), type: 'Long' },
{ seqNum: 4, seqType: Decimal128("10"), type: 'Decimal128' },
// Output truncated

์‹œํ€€์Šค ๋ฒˆํ˜ธ(seqNum) ์ธ๋ฑ์Šค๋Š” ๋™์ผํ•œ ์œ ํ˜•์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. seqNum ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ keyTypes ์ปฌ๋ ‰์…˜์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

db.keyTypes.find( {}, { _id: 0 } ).sort( { seqNum: 1} )

seqNum ํ‚ค๋Š” ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{ seqNum: 1, seqType: null, type: 'null' },
{ seqNum: 2, seqType: 10, type: 'Int32' },
{ seqNum: 3, seqType: Long("10"), type: 'Long' },
{ seqNum: 4, seqType: Decimal128("10"), type: 'Decimal128' },
{ seqNum: 5, seqType: 10, type: 'Double' },
{ seqNum: 6, seqType: '10', type: 'String' },
{ seqNum: 7, seqType: [ '1', '2', '3' ], type: 'Array' },
// Output truncated

์‹œํ€€์Šค ์œ ํ˜•(seqType) ์ธ๋ฑ์Šค๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. seqType ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ keyTypes ์ปฌ๋ ‰์…˜์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

db.keyTypes.find( {}, { _id: 0 } ).sort( { seqType: 1} )

๋ฌธ์„œ๋Š” BSON ์œ ํ˜• ์ •๋ ฌ ์ˆœ์„œ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{ seqNum: 1, seqType: null, type: 'null' },
{ seqNum: 29, seqType: null, type: 'null' },
{ seqNum: 9, seqType: [ 1, 2, 3 ], type: 'Array' },
{ seqNum: 21, seqType: [ 1, 2, 3 ], type: 'Array' },
{ seqNum: 2, seqType: 10, type: 'Int32' },
{ seqNum: 28, seqType: 10, type: 'Int32' },
{ seqNum: 3, seqType: Long("10"), type: 'Long' },
{ seqNum: 27, seqType: Long("10"), type: 'Long' },
{ seqNum: 4, seqType: Decimal128("10"), type: 'Decimal128' },
{ seqNum: 26, seqType: Decimal128("10"), type: 'Decimal128' },
{ seqNum: 5, seqType: 10, type: 'Double' },
{ seqNum: 25, seqType: 10, type: 'Double' },
{ seqNum: 7, seqType: [ '1', '2', '3' ], type: 'Array' },
{ seqNum: 23, seqType: [ '1', '2', '3' ], type: 'Array' },
{ seqNum: 6, seqType: '10', type: 'String' },
{ seqNum: 24, seqType: '10', type: 'String' },
{ seqNum: 8, seqType: [ [ 1 ], [ 2 ], [ 3 ] ], type: 'Array' },
{ seqNum: 22, seqType: [ [ 1 ], [ 2 ], [ 3 ] ], type: 'Array ' },
{
seqNum: 13,
seqType: ObjectId("6239e3922604d5a7478df071"),
type: 'ObjectId'
},
{ seqNum: 10, seqType: true, type: 'Boolean' },
{
seqNum: 12,
seqType: ISODate("2022-03-22T14:56:18.100Z"),
type: 'Date'
},
{
seqNum: 11,
seqType: Timestamp({ t: 1647960978, i: 1 }),
type: 'Timestamp'
}
  • ๋ฐฐ์—ด ๋น„๊ต์—์„œ

    • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์€ BSON ์œ ํ˜• ์ •๋ ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐฐ์—ด ์˜ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    • ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์€ BSON ์œ ํ˜•์˜ ์—ญ์ˆœ ์ •๋ ฌ์— ๋”ฐ๋ผ ๋ฐฐ์—ด ์˜ ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฐ ๊ณผ $lt๊ฐ™์€ ๋น„๊ต $gt ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์ž๋Š” ์‚ฌ์ „์ˆœ์œผ๋กœ ๋ฐฐ์—ด์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐ’์ด ํ•œ ์š”์†Œ ๋ฐฐ์—ด ( ์˜ˆ์‹œ : [ 1 ])์ธ ํ•„๋“œ ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•„๋“œ( ์˜ˆ์‹œ: 2)์™€ ๋น„๊ตํ•  ๋•Œ ๋น„๊ต๋Š” 1 ๋ฐ 2์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๋นˆ ๋ฐฐ์—ด ( ์˜ˆ์‹œ: [ ])์„ ๋น„๊ตํ•˜๋ฉด ๋นˆ ๋ฐฐ์—ด ์ด null ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๋ˆ„๋ฝ๋œ ํ•„๋“œ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

    • ์ค‘์ฒฉ๋œ ๋ฐฐ์—ด ์˜ ๋น„๊ต( ์˜ˆ์‹œ : [[1, 2], [3, 4]])๋Š” ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ๋ฐฐ์—ด ์ดํ›„์˜ ๋ชจ๋“  ๋ฐฐ์—ด ์‚ฌ์ „์ˆœ์œผ๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

  • ์ˆซ์ž ํ˜•์‹(Int32, Long, Decimal128, Double)์€ ๋‹ค๋ฅธ ์œ ํ˜•๊ณผ ๋น„๊ตํ•ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

  • ์ˆซ์ž BSON ์œ ํ˜•์—์„œ ์ˆซ์ž ์œ ํ˜•์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

    • Int32

    • Long

    • Decimal128

    • Double