Docs Menu

์ฐพ๊ธฐ

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

find

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ปค์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ ๋ฐฐ์น˜์™€ ์ปค์„œ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํŒ

mongosh์—์„œ ์ด ๋ช…๋ น์€ db.collection.find() ๋˜๋Š” db.collection.findOne() ํ—ฌํผ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—ฌํผ ๋ฉ”์„œ๋“œ๋Š” mongosh ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ช…๋ น๊ณผ ๋™์ผํ•œ ์ˆ˜์ค€์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ๋ฆฌํ„ด ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

์ค‘์š”

์ด ๋ช…๋ น์€ M0, M2 ๋ฐ M5 ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ œํ•œ์ ์œผ๋กœ ์ง€์› ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ช…๋ น์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

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

find ๋ช…๋ น์˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 5.0์—์„œ ๋ณ€๊ฒฝ๋จ

db.runCommand(
{
find: <string>,
filter: <document>,
sort: <document>,
projection: <document>,
hint: <document or string>,
skip: <int>,
limit: <int>,
batchSize: <int>,
singleBatch: <bool>,
comment: <any>,
maxTimeMS: <int>,
readConcern: <document>,
max: <document>,
min: <document>,
returnKey: <bool>,
showRecordId: <bool>,
tailable: <bool>,
oplogReplay: <bool>,
noCursorTimeout: <bool>,
awaitData: <bool>,
allowPartialResults: <bool>,
collation: <document>,
allowDiskUse : <bool>,
let: <document> // Added in MongoDB 5.0
}
)

์ด ๋ช…๋ น์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„๋“œ
์œ ํ˜•
์„ค๋ช…

find

๋ฌธ์ž์—ด

์ฟผ๋ฆฌํ•  ์ปฌ๋ ‰์…˜ ๋˜๋Š” ๋ทฐ ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

filter

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ์ฟผ๋ฆฌ ์ˆ ์–ด์ž…๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๋ฌธ์„œ๊ฐ€ ์ˆ ์–ด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ๊ฒฐ๊ณผ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š” ์ •๋ ฌ ์ง€์ •์ž…๋‹ˆ๋‹ค.

projection

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ๋ฐ˜ํ™˜๋œ ๋ฌธ์„œ์— ํฌํ•จํ•  ํ•„๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ์…˜ ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค. ํˆฌ์˜ ๋ฐ ํˆฌ์˜ ์—ฐ์‚ฐ์ž๋ฅผ์ฐธ์กฐํ•˜์„ธ์š”.

๋ทฐ์— ๋Œ€ํ•œ find() ์ž‘์—…์€ ๋‹ค์Œ ์ฟผ๋ฆฌ ๋ฐ ํˆฌ์˜ ์—ฐ์‚ฐ์ž ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

hint

๋ฌธ์ž์—ด ๋˜๋Š” ๋ฌธ์„œ

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

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ช…๋ น์— min ๋ฐ/๋˜๋Š” max ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ hint๊ฐ€ ํ•„์š”ํ•˜๊ณ , filter๊ฐ€ _id ํ•„๋“œ { _id: <value> }์˜ ๋™์ผ์„ฑ ์กฐ๊ฑด์ธ ๊ฒฝ์šฐ min ๋ฐ/๋˜๋Š” max์™€ ํ•จ๊ป˜ hint๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

skip

์–‘์˜ ์ •์ˆ˜

์„ ํƒ ์‚ฌํ•ญ. ๊ฑด๋„ˆ๋›ธ ๋ฌธ์„œ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์ž…๋‹ˆ๋‹ค.

limit

Non-negative integer

์„ ํƒ ์‚ฌํ•ญ. ๋ฐ˜ํ™˜ํ•  ๋ฌธ์„œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜. ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ '์ œํ•œ ์—†์Œ'์ž…๋‹ˆ๋‹ค. ๊ฐœ๋กœ ์ œํ•œํ•˜๋ฉด ์ œํ•œ์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

batchSize

non-negative integer

์„ ํƒ ์‚ฌํ•ญ. ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜์—์„œ ๋ฐ˜ํ™˜ํ•  ๋ฌธ์„œ ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 101์ž…๋‹ˆ๋‹ค. batchSize๊ฐ€ ์ด๋ฉด ์ปค์„œ๊ฐ€ ์„ค์ •๋˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜์—์„œ๋Š” ๋ฌธ์„œ๊ฐ€ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ „ ์œ ์„  ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „๊ณผ ๋‹ฌ๋ฆฌ ๋ช…๋ น์˜ 1 batchSize๊ฐ€ ์ด๋ฉด find ์ปค์„œ ๋‹ซํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

singleBatch

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. ์ฒซ ๋ฒˆ์งธ ์ผ๊ด„ ์ฒ˜๋ฆฌ ํ›„์— ์ปค์„œ๋ฅผ ๋‹ซ์„์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

comment

any

์„ ํƒ ์‚ฌํ•ญ. ์ด ๋ช…๋ น์— ์ฒจ๋ถ€ํ•  ์‚ฌ์šฉ์ž ์ œ๊ณต ์ฝ”๋ฉ˜ํŠธ์ž…๋‹ˆ๋‹ค. ์„ค์ •๋˜๋ฉด ์ด ์„ค๋ช…์€ ๋‹ค์Œ ์œ„์น˜์—์„œ ์ด ๋ช…๋ น์˜ ๋ ˆ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€์€ ์œ ํšจํ•œ ๋ชจ๋“  BSON types (๋ฌธ์ž์—ด, ์ •์ˆ˜, ๊ฐ์ฒด, ๋ฐฐ์—ด ๋“ฑ)์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

find ๋ช…๋ น์— ์„ค์ •๋œ ๋ชจ๋“  ์ฃผ์„์€ find ์ปค์„œ์—์„œ ์‹คํ–‰๋˜๋Š” ํ›„์† getMore ๋ช…๋ น์— ์˜ํ•ด ์ƒ์†๋ฉ๋‹ˆ๋‹ค.

maxTimeMS

non-negative integer

์„ ํƒ ์‚ฌํ•ญ.

์‹œ๊ฐ„ ์ œํ•œ์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. maxTimeMS์— ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์—…์ด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0 ๊ฐ’์€ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

MongoDB๋Š” db.killOp()์™€ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹น๋œ ์‹œ๊ฐ„ ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋Š” ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. MongoDB๋Š” ์ง€์ •๋œ ์ค‘๋‹จ ์ง€์  ์ค‘ ํ•˜๋‚˜์—์„œ๋งŒ ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

linearizable read concern๋ฅผ ์ง€์ •ํ•  ๋•Œ๋Š” ๋ฐ์ดํ„ฐ ๋ณด์œ  ๋ฉค๋ฒ„์˜ ๊ณผ๋ฐ˜์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ maxTimeMS๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. maxTimeMS๋Š” ์ž‘์—…์ด ๋ฌด๊ธฐํ•œ ์ฐจ๋‹จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ฉฐ, ์ฝ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

readConcern

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ์ฝ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

readConcern ์˜ต์…˜์˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. readConcern: { level: <value> }

๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ๊ณ ๋ ค ์ˆ˜์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • "local". This is the default read concern level for read operations against the primary and secondaries.

  • "available"์ž…๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฐ ์„ธ์ปจ๋”๋ฆฌ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "available"์€ ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฐ ๋น„ ์ƒค๋“œํ˜• ์„ธ์ปจ๋”๋ฆฌ์— ๋Œ€ํ•ด "local"๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋Š” ์ธ์Šคํ„ด์Šค์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • "majority". WiredTiger ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • "linearizable". primary์˜ ์ฝ๊ธฐ ์ž‘์—…์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ ๊ณ ๋ ค ์ˆ˜์ค€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ๊ธฐ ๊ณ ๋ ค ์ˆ˜์ค€์„ ์ฐธ์กฐํ•˜์„ธ์š”.

getMore ๋ช…๋ น์€ ์›๋ž˜ find ๋ช…๋ น์— ์ง€์ •๋œ readConcern ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

max

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ํŠน์ • ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ๋ฐฐํƒ€์  ์ƒํ•œ์„ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ cursor.max() ์ฐธ์กฐํ•˜์„ธ์š”.

max ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ง€์ •๋œ filter ๊ฐ€ _id ํ•„๋“œ { _id: <value> }์˜ ๋™์ผ์„ฑ ์กฐ๊ฑด์ด ์•„๋‹Œ ํ•œ ๋ช…๋ น์— hint ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

min

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ. ํŠน์ • ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ํฌ๊ด„ ํ•˜ํ•œ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ cursor.min() ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

min ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ง€์ •๋œ filter ๊ฐ€ _id ํ•„๋“œ { _id: <value> }์˜ ๋™์ผ์„ฑ ์กฐ๊ฑด์ด ์•„๋‹Œ ํ•œ ๋ช…๋ น์— hint ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

returnKey

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. true์ธ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ ๋ฌธ์„œ์˜ ์ธ๋ฑ์Šค ํ‚ค๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. returnKey ๊ฐ€ true find ์ด๊ณ  ๋ช…๋ น์ด ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๋œ ๋ฌธ์„œ๋Š” ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

showRecordId

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. ๊ฐ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ ์‹๋ณ„์ž๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. true์ด๋ฉด ๋ฐ˜ํ™˜๋œ ๋ฌธ์„œ์— $recordId ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

tailable

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. ์ œํ•œ๋œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ํ…Œ์ผ ์ปค์„œ(tailable cursor)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

awaitData

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. tailable ์˜ต์…˜๊ณผ ํ•จ๊ป˜ getMore ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๋Œ€์‹  ๋ฐ์ดํ„ฐ ๋์—์„œ ์ปค์„œ ๋ช…๋ น์„ ์ผ์‹œ์  ์ฐจ๋‹จ . ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉดfind ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

noCursorTimeout

๋ถ€์šธ

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

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ. ์ƒค๋“œ๋œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ, ์ฟผ๋ฆฌ๋œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ƒค๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ช…๋ น(๋˜๋Š” ํ›„์† getMore ๋ช…๋ น)์ด ์˜ค๋ฅ˜ ๋Œ€์‹  ๋ถ€๋ถ„์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

collation

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ.

์ž‘์—…์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ปฌ๋ ‰์…˜์— ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ( db.createCollection() ์ฐธ์กฐ), ์ž‘์—…์€ ์ปฌ๋ ‰์…˜์— ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

ํ•œ ์—ฐ์‚ฐ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•„๋“œ๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ •๋ ฌ๊ณผ ํ•จ๊ป˜ ์ฐพ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ฐพ๊ธฐ ์™€ ์ •๋ ฌ์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ.

์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ allowDiskUseByDefault๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””์Šคํฌ ์‚ฌ์šฉ์ด ํ—ˆ์šฉ๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋””์Šคํฌ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””์Šคํฌ ์‚ฌ์šฉ์ด ๊ธˆ์ง€๋œ ์‹œ์Šคํ…œ์—์„œ ๋””์Šคํฌ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

MongoDB 6.0๋ถ€ํ„ฐ allowDiskUseByDefault๊ฐ€ true๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  ์„œ๋ฒ„์˜ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ๋‹จ๊ณ„์— 100๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ์ด์ƒ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ MongoDB๋Š” ์ฟผ๋ฆฌ์— { allowDiskUse: false }๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ž„์‹œ ํŒŒ์ผ์„ ๋””์Šคํฌ์— ์ž๋™์œผ๋กœ ์”๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ allowDiskUseByDefault๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB ์ธ๋ฑ์Šค ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ์ •๋ ฌ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ธ”๋กœํ‚น ์ •๋ ฌ ์— 100 ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋ฏธ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ allowDiskUse ์€ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

allowDiskUse ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ฌธ์„œ๋Š” cursor.allowDiskUse() ์ฐธ์กฐํ•˜์„ธ์š”.

๋Œ€์šฉ๋Ÿ‰ ์ฐจ๋‹จ ์ •๋ ฌ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •๋ ฌ ๋ฐ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์„์ฐธ์กฐํ•˜์„ธ์š”.

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ.

๋ณ€์ˆ˜ ๋ชฉ๋ก์ด ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ ํ…์ŠคํŠธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ช…๋ น ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

๋ณ€์ˆ˜๋Š” ํ‘œํ˜„์‹์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๋ฉฐ ์ดํ›„์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์—์„œ ๋ณ€์ˆ˜ ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด $<variable_name> ํ˜•์‹์˜ ์ด์ค‘ ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ ์ ‘๋‘์‚ฌ ($) ๋ฅผ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.์˜ˆ์‹œ: $targetTotal.

๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด $expr ์—ฐ์‚ฐ์ž ๋‚ด์—์„œ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒด ์˜ˆ์‹œ let ๋Š” ์—์„œ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.let

๋ฒ„์ „ 5.0์— ์ถ”๊ฐ€.

์ด ๋ช…๋ น์€ ์ปค์„œ ID ๋ฐ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์„œ ๋ฐฐ์น˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์ปค์„œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒค๋”ฉ๋œ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ๋ฌธ์„œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{
"cursor" : {
"firstBatch" : [
{
"_id" : ObjectId("5e8e2ca217b5324fa9847435"),
"zipcode" : "20001",
"x" : 1
},
{
"_id" : ObjectId("5e8e2ca517b5324fa9847436"),
"zipcode" : "30001",
"x" : 1
}
],
"partialResultsReturned" : true,
"id" : NumberLong("668860441858272439"),
"ns" : "test.contacts"
},
"ok" : 1,
"operationTime" : Timestamp(1586380205, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1586380225, 2),
"signature" : {
"hash" : BinData(0,"aI/jWsUVUSkMw8id+A+AVVTQh9Y="),
"keyId" : NumberLong("6813364731999420435")
}
}
}
ํ•„๋“œ
์„ค๋ช…

cursor

์ปค์„œ id ๋ฐ ๋ฌธ์„œ์˜ firstBatch ์„ ํฌํ•จํ•˜์—ฌ ์ปค์„œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ƒค๋”ฉ๋œ ์ปฌ๋ ‰์…˜ ์— ๋Œ€ํ•œ ์ž‘์—…์ด ์ฟผ๋ฆฌ๋œ ์ƒค๋“œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ cursor ๋ฌธ์„œ partialResultsReturned ํ•„๋“œ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋œ ์ƒค๋“œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด allowPartialResults๋ฅผ ๋กœ ์„ค์ •ํ•˜๋‹ค ์ƒํƒœ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ find ํ•ด์•ผ true ํ•ฉ๋‹ˆ๋‹ค. allowPartialResults๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฟผ๋ฆฌ๋œ ์ƒค๋“œ๋ฅผ ์ฒ˜์Œ์—๋Š” find ๋ช…๋ น์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ›„์† ๋ช…๋ น์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ƒค๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” getMore ๊ฒฝ์šฐ,getMore ์ฟผ๋ฆฌ๋œ ์ƒค๋“œ ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ์‹คํ–‰ ๋ช…๋ น๋งŒ ๋‹ค์Œ ํ•„๋“œ์— partialResultsReturned ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ.

"ok"

๋ช…๋ น์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€(1) ๋˜๋Š” ์‹คํŒจํ–ˆ๋Š”์ง€(0) ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ find ๊ด€๋ จ ํ•„๋“œ ์™ธ์—๋„ db.runCommand()์—๋Š” ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฐ ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • $clusterTime

  • operationTime

์ž์„ธํ•œ ๋‚ด์šฉ์€ db.runCommand() ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 5.1๋ถ€ํ„ฐ ์ž˜๋ชป๋œ $regex options ์˜ต์…˜์€ ๋” ์ด์ƒ ๋ฌด์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ $regex options๋Š” aggregate ๋ช…๋ น ๋ฐ ํˆฌ์˜ ์ฟผ๋ฆฌ์—์„œ $regex์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ์…˜ ๋‚ด์—์„œ ์ƒ์„ฑ๋œ ์ปค์„œ์˜ ๊ฒฝ์šฐ ์„ธ์…˜ ์™ธ๋ถ€์—์„œ getMore์„(๋ฅผ) ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ธ์…˜ ์™ธ๋ถ€์—์„œ ๋งŒ๋“  ์ปค์„œ์˜ ๊ฒฝ์šฐ ์„ธ์…˜ ๋‚ด๋ถ€์—์„œ getMore๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

MongoDB ๋“œ๋ผ์ด๋ฒ„์™€ mongosh๋Š” ์Šน์ธ๋˜์ง€ ์•Š์€ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์„œ๋ฒ„ ์„ธ์…˜๊ณผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜๊ณผ ๋ช…์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ž‘์—…(์˜ˆ: Mongo.startSession() ์‚ฌ์šฉ)์˜ ๊ฒฝ์šฐ, MongoDB ๋“œ๋ผ์ด๋ฒ„์™€ mongosh๋Š” ์•”์‹œ์  ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ž‘์—…๊ณผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์„ธ์…˜์ด 30๋ถ„ ์ด์ƒ ์œ ํœด ์ƒํƒœ์ธ ๊ฒฝ์šฐ, MongoDB ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์„ธ์…˜์„ ๋งŒ๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์–ธ์ œ๋“ ์ง€ ์„ธ์…˜์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MongoDB ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜์„ ์ข…๋ฃŒํ•˜๋ฉด ์ง„ํ–‰ ์ค‘์ธ ๋ชจ๋“  ์ž‘์—…๊ณผ ํ•ด๋‹น ์„ธ์…˜๊ณผ ๊ด€๋ จ๋œ ์—ด๋ฆฐ ์ปค์„œ๋„ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” noCursorTimeout() ๋˜๋Š” 30๋ถ„๋ณด๋‹ค ํฐ maxTimeMS()๋กœ ๊ตฌ์„ฑ๋œ ์ปค์„œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ปค์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ปค์„œ๊ฐ€ 30๋ถ„ ์ด์ƒ ์œ ํœด ์ƒํƒœ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ช…์‹œ์  ์„ธ์…˜ ๋‚ด์—์„œ Mongo.startSession()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  refreshSessions ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ธ์…˜ ์œ ํœด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

find๋Š” ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ๋œ ์ปค์„œ์˜ ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ getMore์„(๋ฅผ) ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜์—์„œ ์ƒ์„ฑ๋œ ์ปค์„œ์˜ ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ ์™ธ๋ถ€์—์„œ getMore๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ค‘์š”

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

์ถ”๊ฐ€ ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ ๊ณ ๋ ค ์‚ฌํ•ญ(์˜ˆ: ๋Ÿฐํƒ€์ž„ ์ œํ•œ ๋ฐ oplog ํฌ๊ธฐ ์ œํ•œ)์€ ํ”„๋กœ๋•์…˜ ๊ณ ๋ ค์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 4.2๋ถ€ํ„ฐ find๋ฅผ ๋ฐœ๊ธ‰ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์—ฐ๊ฒฐ์„ ๋Š๋Š” ๊ฒฝ์šฐ, MongoDB๋Š” find๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฅผkillOp์„ ์ข…๋ฃŒ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Stable API V1๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ find ๋ช…๋ น ํ•„๋“œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • awaitData

  • max

  • min

  • noCursorTimeout

  • oplogReplay

  • returnKey

  • showRecordId

  • tailable

MongoDB 6.0๋ถ€ํ„ฐ ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋Š” ์ด์ „์— ๋ช…๋ น์„ planCacheSetFilter ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

MongoDB 8.0 ๋ถ€ํ„ฐ๋Š” ์ธ๋ฑ์Šค ํ•„ํ„ฐ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ์ฟผ๋ฆฌ ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋Š” MongoDB 8.0 ๋ถ€ํ„ฐ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์„ค์ •์—๋Š” ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋Š” ์˜๊ตฌ์ ์ด์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜ˆ์ œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด setQuerySettings ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 7.3 ๋ถ€ํ„ฐ singleBatch: true ๋ฐ batchSize: 1 ์˜ต์…˜์ด ์žˆ๋Š” ๋ทฐ์—์„œ ์ฐพ๊ธฐ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ๋•Œ ์ปค์„œ ๊ฐ€ ๋” ์ด์ƒ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „์˜ MongoDB ์—์„œ๋Š” ๋‹จ์ผ ๋ฐฐ์น˜ ์˜ต์…˜์„ true ๋กœ ์„ค์ •ํ•˜๋‹ค ํ•œ ๊ฒฝ์šฐ์—๋„ ์ด๋Ÿฌํ•œ ์ฐพ๊ธฐ ์ฟผ๋ฆฌ๊ฐ€ ์ปค์„œ ๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 8.0์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

์ฟผ๋ฆฌ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๋ ค๋ฉด setQuerySettings๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

find, distinct ๋ฐ aggregate ๋ช…๋ น์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์„ค์ •์€ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค ํ•„ํ„ฐ๋ณด๋‹ค ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์„ค์ •์„ ์ œ๊ฑฐ ํ•˜๋ ค๋ฉด removeQuerySettings ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์„ค์ •์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ง‘๊ณ„ ํŒŒ์ดํ”„๋ผ์ธ ์—์„œ $querySettings ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์€ find ๋ช…๋ น ํ•„ํ„ฐ๋ง์„ rating ํ•„๋“œ์™€ cuisine ํ•„๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์—๋Š” ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ์—์„œ _id, name, rating๋ฐ address ํ•„๋“œ์˜ ํ•„๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” projection(์ด)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ๋ฌธ์„œ๋ฅผ name ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ 5๊ฐœ ๋ฌธ์„œ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

db.runCommand(
{
find: "restaurants",
filter: { rating: { $gte: 9 }, cuisine: "italian" },
projection: { name: 1, rating: 1, address: 1 },
sort: { name: 1 },
limit: 5
}
)

๊ธฐ๋ณธ ์ฝ๊ธฐ ๋ฌธ์ œ ์ˆ˜์ค€์ธ "local" ๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๋ฉด readConcern ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋ณต์ œ๋ณธ ์„ธํŠธ์— ๋Œ€ํ•œ ๋‹ค์Œ ์ž‘์—…์€ ๋Œ€๋ถ€๋ถ„์˜ ๋…ธ๋“œ์— ๊ธฐ๋ก๋œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๋ณต์ œ๋ณธ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก "majority"์˜ ์ฝ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

db.runCommand(
{
find: "restaurants",
filter: { rating: { $lt: 5 } },
readConcern: { level: "majority" }
}
)

์ฝ๊ธฐ ๊ณ ๋ ค ์ˆ˜์ค€์— ๊ด€๊ณ„์—†์ด ๋…ธ๋“œ์˜ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋Š” ์‹œ์Šคํ…œ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ๋ฒ„์ „์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

getMore ๋ช…๋ น์€ ์›๋ž˜ find ๋ช…๋ น์— ์ง€์ •๋œ readConcern ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

cursor.readConcern() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mongosh ๋ฉ”์„œ๋“œ db.collection.find()์— readConcern์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.restaurants.find( { rating: { $lt: 5 } } ).readConcern("majority")

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ์šฐ๋ ค์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ๊ธฐ ์šฐ๋ ค์‚ฌํ•ญ์„์ฐธ์กฐํ•˜์„ธ์š”.

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

๋‹ค์Œ ์ž‘์—…์€ ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ find ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

db.runCommand(
{
find: "myColl",
filter: { category: "cafe", status: "a" },
sort: { category: 1 },
collation: { locale: "fr", strength: 1 }
}
)

mongosh๋Š” db.collection.find() ์ž‘์—…์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด cursor.collation()์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 5.0์— ์ถ”๊ฐ€.

๋ช…๋ น์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด let ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด $expr ์—ฐ์‚ฐ์ž ๋‚ด์—์„œ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜ cakeFlavors์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค:

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” let์— targetFlavor ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ์ฝœ๋ฆฟ ์ผ€์ดํฌ ๋ง›์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

db.cakeFlavors.runCommand( {
find: db.cakeFlavors.getName(),
filter: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
let : { targetFlavor: "chocolate" }
} )

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