[MongoDB] Index: Partial Index

๋•Œ๋กœ๋Š”, ์ธ๋ฑ์Šค๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ฑ์Šค๋„ ์Œ“์ด๊ณ  ์Œ“์ด๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ๋ฅผ ์ ์œ ํ•˜๋Š” ์–‘์ด ํฌ๊ฒŒ ๋Š˜ ์ˆ˜ ์žˆ๋Š”๋ฐ, Partial Index๋Š” ๊ทธ๊ฑธ ์ข€ ํ•œ์ •ํ•ด์„œ ์ค„์ด๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. partialFilterExpression์— ์กฐ๊ฑด์‹์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

db.์ปฌ๋ ‰์…˜.createIndex(
  { ์ธ๋ฑ์Šค ๋Œ€์ƒ ํ•„๋“œ... },
  {
    partialFilterExpression: { ์กฐ๊ฑด์‹... },
  }
);

๊ทธ๋Ÿฌ๋ฉด partialFilterExpression ์กฐ๊ฑด์‹์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๋˜ ์กฐํšŒํ• ๋•Œ๋„ ๋‹น์—ฐํžˆ partialFilterExpression์— ๋ถ€ํ•ฉํ•ด์•ผ๋งŒ ์ธ๋ฑ์Šค๋ฅผ ํƒ€๊ณ , ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ธ๋ฑ์Šค ์Šค์บ”์„ ํƒ€์ง€ ๋ชปํ•œ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํžˆ ์ธ๋ฑ์Šค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์—๋งŒ ๊ฐ•์ ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
unique์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฐ•๋ ฅํ•˜๋ฉด์„œ๋„ ์œ ์—ฐํ•œ DB ์ˆ˜์ค€ ์ œ์•ฝ์„ ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, user ๋ฐ์ดํ„ฐ์— email ๊ธฐ์ค€์œผ๋กœ ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•˜๋˜, ์‚ญ์ œ๋œ ํšŒ์›์€ ์ œ์™ธํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ์ธ๋ฑ์Šค ํ•˜๋‚˜๋งŒ์œผ๋กœ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

db.users.createIndex(
  { email: 1 },
  {
    unique: true,
    partialFilterExpression: { deletedAt: { $eq: null } },
  }
);

์ด๋Ÿฌ๋ฉด ์‚ญ์ œ๋˜์–ด์„œ deletedAt!=null ๋ฐ์ดํ„ฐ๋Š” ์œ ์ผ์„ฑ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์ผ๋‹จ ์Œ“์ด๊ณ , ์‚ญ์ œ๋˜์ง€ ์•Š์•„์„œ deletedAt=null์ธ ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋งŒ ์ด๋ฉ”์ผ ์ค‘๋ณต์„ ๊ฑฐ๋ถ€ํ•  ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://www.mongodb.com/ko-kr/docs/manual/core/index-partial/