Docs Menu

$exists

$exists

$exists ์—ฐ์‚ฐ์ž๋Š” ํ•„๋“œ ๊ฐ’์ด null์ธ ๋ฌธ์„œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ง€์ •๋œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฌธ์„œ๋ฅผ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

MongoDB $exists ์ด(๊ฐ€) SQL ์—ฐ์‚ฐ์ž exists์— ํ•ด๋‹นํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SQL exists์˜ ๊ฒฝ์šฐ $in ์—ฐ์‚ฐ์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Atlas Search exists ์˜ ๊ฒฝ์šฐ Atlas ๋ฌธ์„œ์˜ ์กด์žฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

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

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

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

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

$exists ํ‘œํ˜„์‹์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

{ field: { $exists: <boolean> } }

<boolean>์ด ์ฐธ์ธ ๊ฒฝ์šฐ $exists์€ ํ•„๋“œ ๊ฐ’์ด null์ธ ๋ฌธ์„œ๋ฅผ ํฌํ•จํ•ด ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. <boolean>์ด ๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋Š” ํ•ด๋‹น ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์€ ๋ฌธ์„œ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. [1]

[1] ์‚ฌ์šฉ์ž๋Š” ๋” ์ด์ƒ ์ฟผ๋ฆฌ ํ•„ํ„ฐ $type: 0์„ $exists:false์˜ ๋™์˜์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. null ๋˜๋Š” ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋ฅผ ์ฟผ๋ฆฌํ•˜๋ ค๋ฉด null ๋˜๋Š” ๋ˆ„๋ฝ๋œ ํ•„๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB Atlas์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ $search ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ Atlas Search ์กด์žฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $search ํ›„์— $exists(์„)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์กด์žฌ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ $search(์„)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

์ด ์—ฐ์‚ฐ์ž์˜ Atlas Search ๋ฒ„์ „์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด Atlas ์„ค๋ช…์„œ์—์„œ ์กด์žฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )

์ด ์ฟผ๋ฆฌ๋Š” collection inventory ์—์„œ ํ•„๋“œ qty ์ด(๊ฐ€) ์กด์žฌํ•˜๋ฉฐ, ๋˜ํ•œ ํ•ด๋‹น ๊ฐ’์ด 5 ๋˜๋Š” 15 ์™€ ๊ฐ™์ง€ ์•Š์€ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ๋‹ค์Œ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ spices๋ผ๋Š” ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

db.spices.insertMany( [
{ saffron: 5, cinnamon: 5, mustard: null },
{ saffron: 3, cinnamon: null, mustard: 8 },
{ saffron: null, cinnamon: 3, mustard: 9 },
{ saffron: 1, cinnamon: 2, mustard: 3 },
{ saffron: 2, mustard: 5 },
{ saffron: 3, cinnamon: 2 },
{ saffron: 4 },
{ cinnamon: 2, mustard: 4 },
{ cinnamon: 2 },
{ mustard: 6 }
] )

๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž saffron: { $exists: true }์„(๋ฅผ) ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:

db.spices.find( { saffron: { $exists: true } } )

๊ฒฐ๊ณผ๋Š” saffron ํ•„๋“œ์— null ๊ฐ’์ด ํฌํ•จ๋œ ๋ฌธ์„œ๋ฅผ ํฌํ•จํ•˜์—ฌ saffron ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{ saffron: 5, cinnamon: 5, mustard: null }
{ saffron: 3, cinnamon: null, mustard: 8 }
{ saffron: null, cinnamon: 3, mustard: 9 }
{ saffron: 1, cinnamon: 2, mustard: 3 }
{ saffron: 2, mustard: 5 }
{ saffron: 3, cinnamon: 2 }
{ saffron: 4 }

๋‹ค์Œ ์ฟผ๋ฆฌ๋Š” ์ฟผ๋ฆฌ ์กฐ๊ฑด์ž cinnamon: { $exists: false }์„(๋ฅผ) ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:

db.spices.find( { cinnamon: { $exists: false } } )

๊ฒฐ๊ณผ๋Š” cinnamon ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฌธ์„œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

{ saffron: 2, mustard: 5 }
{ saffron: 4 }
{ mustard: 6 }

์‚ฌ์šฉ์ž๋Š” ๋” ์ด์ƒ ์ฟผ๋ฆฌ ํ•„ํ„ฐ $type: 0์„ $exists:false์˜ ๋™์˜์–ด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. null ๋˜๋Š” ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋ฅผ ์ฟผ๋ฆฌํ•˜๋ ค๋ฉด null ๋˜๋Š” ๋ˆ„๋ฝ๋œ ํ•„๋“œ ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ํฌ์†Œ ์ธ๋ฑ์Šค์™€ ๋น„ํฌ์†Œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ $exists ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

$exists ์ฟผ๋ฆฌ
ํฌ์†Œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ
Using a Non-Sparse Index

{ $exists: true }

๊ฐ€์žฅ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. MongoDB๋Š” ์ •ํ™•ํžˆ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ FETCH์ด(๊ฐ€) ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์ฟผ๋ฆฌ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ FETCH ์ด(๊ฐ€) ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

{ $exists: false }

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ COLLSCAN์ด(๊ฐ€) ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

FETCH์ด(๊ฐ€) ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํฌ์†Œ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ ํ•„๋“œ์— { $exists: true } ์„(๋ฅผ) ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์€ ํ•„๋“œ์— { $exists: true } ์„(๋ฅผ) ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” collection์˜ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋ ค๋ฉด ๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ฐ™์ด field ์— ํฌ์†Œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

  1. stockSales collection์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    db.stockSales.insertMany( [
    { _id: 0, symbol: "MDB", auditDate: new Date( "2021-05-18T16:12:23Z" ) },
    { _id: 1, symbol: "MDB", auditDate: new Date( "2021-04-21T11:34:45Z" ) },
    { _id: 2, symbol: "MSFT", auditDate: new Date( "2021-02-24T15:11:32Z" ) },
    { _id: 3, symbol: "MSFT", auditDate: null },
    { _id: 4, symbol: "MSFT", auditDate: new Date( "2021-07-13T18:32:54Z" ) },
    { _id: 5, symbol: "AAPL" }
    ] )

    ๋‹ค์Œ์˜ _id ์ด ํฌํ•จ๋œ ๋ฌธ์„œ:

    • 3 null auditDate ๊ฐ’์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

    • 5 auditDate ๊ฐ’์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

    db.getCollection( "stockSales" ).createIndex(
    { auditDate: 1 },
    { name: "auditDateSparseIndex", sparse: true }
    )
  3. ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” auditDate ํ•„๋“œ์— ๊ฐ’(null ํฌํ•จ)์ด ์žˆ๋Š” ๋ฌธ์„œ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ํฌ์†Œ ์ธ๋ฑ์Šค๋ฅผ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    db.stockSales.countDocuments( { auditDate: { $exists: true } } )

    ํ•ด๋‹น ์˜ˆ์‹œ์—์„œ๋Š” 5๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. auditDate ๊ฐ’์ด ๋ˆ„๋ฝ๋œ ๋ฌธ์„œ๋Š” ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒ

field ์— null์ด ์•„๋‹Œ ๊ฐ’์ด ์žˆ๋Š” ๋ฌธ์„œ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹ค์‹œํ•ฉ๋‹ˆ๋‹ค.

  • $exists: true ๋Œ€์‹  $ne: null ์„(๋ฅผ) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • field ์—๋Š” ํฌ์†Œ ์ธ๋ฑ์Šค์ด(๊ฐ€) ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, stockSales collection์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

db.stockSales.countDocuments( { auditDate: { $ne: null } } )

์ด ์˜ˆ์‹œ์—์„œ๋Š” 4๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. auditDate ๊ฐ’์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ null auditDate ๊ฐ’์ด ์žˆ๋Š” ๋ฌธ์„œ๋Š” ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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