Docs Menu

Multikey Indexes

๋ฐฐ์—ด ๊ฐ’์ด ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด MongoDB๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ๊ณ ์œ  ์š”์†Œ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋Š” ๋ฐฐ์—ด ํ•„๋“œ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์Šค์นผ๋ผ ๊ฐ’ [1] ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•ด ๋‹ค์ค‘ ํ‚ค ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ฌธ์ž์—ด, ์ˆซ์ž) ๋ฐ ์ค‘์ฒฉ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์— ๋™์ผํ•œ ๊ฐ’์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค์—๋Š” ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์ด ํ•˜๋‚˜๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

``addr.zip`` ํ•„๋“œ์˜ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์ž…๋‹ˆ๋‹ค. ``addr`` ํ•„๋“œ์—๋Š” ์ฃผ์†Œ ๋ฌธ์„œ ๋ฐฐ์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์†Œ ๋ฌธ์„œ์—๋Š” ``zip`` ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
[1] ์Šค์นผ๋ผ ๊ฐ’์€ ๋‚ด์žฅ๋œ ๋ฌธ์„œ๋„ ๋ฐฐ์—ด๋„ ์•„๋‹Œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

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

MongoDB Atlas์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๋ฐฐํฌ์˜ ์ธ๋ฑ์Šค ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ธ๋ฑ์Šค ์ƒ์„ฑ, ๋ณด๊ธฐ, ์‚ญ์ œ ๋ฐ ์ˆจ๊ธฐ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด db.collection.createIndex() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

db.coll.createIndex( { <field>: < 1 or -1 > } )

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

์ฐธ๊ณ 

WiredTiger ๋ฐ ์ธ๋ฉ”๋ชจ๋ฆฌ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

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

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

๊ณ ์œ  ์ธ๋ฑ์Šค ์˜ ๊ฒฝ์šฐ, ๊ณ ์œ  ์ œ์•ฝ ์กฐ๊ฑด์€ ๋‹จ์ผ ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ collection์˜ ๊ฐœ๋ณ„ ๋ฌธ์„œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐœ๋ณ„ ๋ฌธ์„œ ๊ฐ„ ๊ณ ์œ  ์ œ์•ฝ ์กฐ๊ฑด์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ, ๊ฐ ์ธ๋ฑ์Šค๋œ ๋ฌธ์„œ์—๋Š” ๊ฐ’์ด ๋ฐฐ์—ด์ธ ์ธ๋ฑ์Šค๋œ ํ•„๋“œ๊ฐ€ ์ตœ๋Œ€ ํ•˜๋‚˜๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰:

  • ๋ฌธ์„œ์—์„œ ๋‘˜ ์ด์ƒ์˜ ์ธ๋ฑ์‹ฑํ•  ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ collection์„ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    { _id: 1, a: [ 1, 2 ], b: [ 1, 2 ], category: "AB - both arrays" }

    a ๋ฐ b ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ ๋ฐฐ์—ด์ด๋ฏ€๋กœ collection์— ๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค { a: 1, b: 1 } ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

    { _id: 1, a: [1, 2], b: 1, category: "A array" }
    { _id: 2, a: 1, b: [1, 2], category: "B array" }

    ๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค { a: 1, b: 1 } ์€ ํ—ˆ์šฉ๋˜๋Š”๋ฐ, ์ด๋Š” ๊ฐ ๋ฌธ์„œ์— ๋Œ€ํ•ด ๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋กœ ์ธ๋ฑ์‹ฑ๋˜๋Š” ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด ํ•˜๋‚˜๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, a ๋ฐ b ํ•„๋“œ ๋ชจ๋‘์— ๋Œ€ํ•œ ๋ฐฐ์—ด ๊ฐ’์ด ํฌํ•จ๋œ ๋ฌธ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋‚˜ ๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ a ๋ฐ b ํ•„๋“œ๊ฐ€ ๋ชจ๋‘ ๋ฐฐ์—ด์ธ ๋ฌธ์„œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด MongoDB๊ฐ€ ์‚ฝ์ž…์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ๊ฐ€ ๋ฌธ์„œ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ์ธ๋ฑ์Šคํ™”ํ•˜์—ฌ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ collection์„ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{ _id: 1, a: [ { x: 5, z: [ 1, 2 ] }, { z: [ 1, 2 ] } ] }
{ _id: 2, a: [ { x: 5 }, { z: 4 } ] }

{ "a.x": 1, "a.z": 1 } ์— ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๋Œ€ ํ•˜๋‚˜์˜ ์ธ๋ฑ์‹ฑ๋œ ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ œํ•œ๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ๋Š” ๋‚ด์žฅ๋œ ๋ฌธ์„œ๊ฐ€ ์žˆ๋Š” ์ธ๋ฑ์Šค ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

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

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

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

๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์ƒค๋“œ ํ‚ค ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜ ์ƒค๋“œ ํ‚ค ์ธ๋ฑ์Šค๊ฐ€ ๋ณตํ•ฉ ์ธ๋ฑ์Šค์˜ ์ ‘๋‘์‚ฌ ์ธ ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ํ‚ค ์ค‘ ํ•˜๋‚˜๊ฐ€ (์ฆ‰, ์ƒค๋“œ ํ‚ค์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ํ‚ค)๋Š” ๋ฐฐ์—ด์„ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด์‹œ๋œ ์ธ๋ฑ์Šค๋Š” ๋ฉ€ํ‹ฐํ‚ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .

๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ๊ฐ€ ๋ฐฐ์—ด ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋ฐฐ์—ด์ด ์ฟผ๋ฆฌ ํ”„๋กœ์ ์…˜์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์ฆ‰, ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์ค‘ ํ‚ค ์ธ๋ฑ์Šค๊ฐ€ ๋ณตํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • $elemMatch๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์›๋˜๋Š” ์ฟผ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œmatches ์ปฌ๋ ‰์…˜์„ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

db.matches.insertMany( [
{ name: "Joe", event: [ "open", "tournament" ] },
{ name: "Bill", event: [ "match", "championship" ] }
] )

matches ์ปฌ๋ ‰์…˜์€ event ๋ฐ name ํ•„๋“œ์— ๋ณตํ•ฉ ๋‹ค์ค‘ ํ‚ค ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

db.matches.createIndex( { event: 1, name: 1 } )

event ํ•„๋“œ์— ๋ฐฐ์—ด ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด์ „ ์ธ๋ฑ์Šค๋Š” ๋ฉ€ํ‹ฐํ‚ค์ž…๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

db.matches.find(
{ event: 'championship' },
{ _id: 0, name: 1 }
)
db.matches.find(
{ name: 'Bill', event: 'championship' },
{ _id: 0, name: 1 }
)

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

db.matches.find(
{ event: 'championship' },
{ _id: 0, event: 1 }
)

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ inventory collection์„ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] }
{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] }
{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] }
{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] }
{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }

collection์— ratings ํ•„๋“œ์— ๋Œ€ํ•œ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

db.inventory.createIndex( { ratings: 1 } )

๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ratings ํ•„๋“œ๊ฐ€ [ 5, 9 ]๋ฐฐ์—ด์ธ ๋ฌธ์„œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

db.inventory.find( { ratings: [ 5, 9 ] } )

MongoDB๋Š” ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ratings ๋ฐฐ์—ด์˜ ์ž„์˜ ์œ„์น˜์— 5๊ฐ€ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ MongoDB๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์„œ๋ฅผ ์กฐํšŒํ•˜๊ณ  ratings ๋ฐฐ์—ด์ด ์ฟผ๋ฆฌ ๋ฐฐ์—ด [ 5, 9 ]์™€ ๋™์ผํ•œ ๋ฌธ์„œ๋ฅผ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

$expr ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ survey ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

db.survey.insertOne(
{ _id: 1, item: "ABC", ratings: [ 2, 5, 9 ] }
)

ํ•„๋“œ ratings ์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

db.survey.createIndex( { ratings: 1 } )

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

  • 2,

  • 5๋ฐ

  • 9.

์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด ํ•„๋“œ์— ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ˜•์‹์˜ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋œ inventory ์ปฌ๋ ‰์…˜์„ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

{
_id: 1,
item: "abc",
stock: [
{ size: "S", color: "red", quantity: 25 },
{ size: "S", color: "blue", quantity: 10 },
{ size: "M", color: "blue", quantity: 50 }
]
}
{
_id: 2,
item: "def",
stock: [
{ size: "S", color: "blue", quantity: 20 },
{ size: "M", color: "blue", quantity: 5 },
{ size: "M", color: "black", quantity: 10 },
{ size: "L", color: "red", quantity: 2 }
]
}
{
_id: 3,
item: "ijk",
stock: [
{ size: "M", color: "blue", quantity: 15 },
{ size: "L", color: "blue", quantity: 100 },
{ size: "L", color: "red", quantity: 25 }
]
}
...

๋‹ค์Œ ์ž‘์—…์€ stock.size ๋ฐ stock.quantity ํ•„๋“œ์— ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )

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

db.inventory.find( { "stock.size": "M" } )
db.inventory.find( { "stock.size": "S", "stock.quantity": { $gt: 20 } } )

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

๋ณตํ•ฉ ๋ฉ€ํ‹ฐํ‚ค ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์€ ์ •๋ ฌ ์ž‘์—…๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.inventory.find( ).sort( { "stock.size": 1, "stock.quantity": 1 } )
db.inventory.find( { "stock.size": "M" } ).sort( { "stock.quantity": 1 } )

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