ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

db.collection.bulkWrite()

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

๋“œ๋ผ์ด๋ฒ„๊ฐ€ ํฌํ•จ๋œ MongoDB

์ด ํŽ˜์ด์ง€์—์„œ๋Š” mongosh ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. MongoDB ๋“œ๋ผ์ด๋ฒ„์—์„œ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ ค๋ฉด ํ•ด๋‹น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

db.collection.bulkWrite()

์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜์—ฌ ์—ฌ๋Ÿฌ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:
  • ์ž‘์—…์ด ์“ฐ๊ธฐ ๊ณ ๋ ค์™€ ํ•จ๊ป˜ ์‹คํ–‰๋œ ๊ฒฝ์šฐ ๋ถ€์šธ acknowledged๋ฅผ true๋กœ, ์“ฐ๊ธฐ ๊ณ ๋ ค๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ false๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์“ฐ๊ธฐ ์ž‘์—…์˜ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฝ์ž…๋˜๊ฑฐ๋‚˜ ์—…์ŠคํŠธ๋œ ๊ฐ ๋ฌธ์„œ์— ๋Œ€ํ•ด _id๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

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

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

์ฐธ๊ณ 

์ด ๋ช…๋ น์€ ๋ชจ๋“  MongoDB Atlas ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ช…๋ น์— ๋Œ€ํ•œ Atlas ์ง€์›์— ๊ด€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ช…๋ น์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

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

์ฐธ๊ณ 

Atlas UI ์—์„œ๋Š” ๋Œ€๋Ÿ‰ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๋ฉด ๋ฌธ์„œ ๋ฐฐ์—ด์„ ์‚ฝ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด Atlas ๋ฌธ์„œ์—์„œ ๋ฌธ์„œ ์ƒ์„ฑ, ๋ณด๊ธฐ, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

bulkWrite() ๋ฉ”์„œ๋“œ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)

bulkWrite() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

operations

๋ฐฐ์—ด

์“ฐ๊ธฐ (write) ์ž‘์—…์˜ bulkWrite() ๋ฐฐ์—ด .

์œ ํšจํ•œ ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ ์ž‘์—…์˜ ์‚ฌ์šฉ๋ฒ•์€ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ฐธ์กฐํ•˜์„ธ์š”.

writeConcern

๋ฌธ์„œ

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ƒ๋žตํ•˜์„ธ์š”.

ํŠธ๋žœ์žญ์…˜์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ํŠธ๋žœ์žญ์…˜์— ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๋ฐ ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ordered

๋ถ€์šธ

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. mongod ์ธ์Šคํ„ด์Šค๊ฐ€ ์ •๋ ฌ๋œ ์ž‘์—…์„ ์‹คํ–‰ํ• ์ง€ ์•„๋‹ˆ๋ฉด ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ž‘์—…์„ ์‹คํ–‰ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

์ž‘์—… ์‹คํ–‰ ์ฐธ์กฐ

bulkWrite()์€ ์“ฐ๊ธฐ ์ž‘์—…์˜ ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์™€์„œ ๊ฐ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—…์€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์ž‘์—… ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๋ ค๋ฉด ์ž‘์—… ์‹คํ–‰์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹จ์ผ ๋ฌธ์„œ๋ฅผ collection์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite( [
{ insertOne : { "document" : <document> } }
] )

db.collection.insertOne()์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

updateOne์€ ํ•„ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ updateOne์€ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite( [
{ updateOne :
{
"filter": <document>,
"update": <document or pipeline>,
"upsert": <boolean>,
"collation": <document>,
"arrayFilters": [ <filterdocument1>, ... ],
"hint": <document|string>
}
}
] )

updateMany์€ ํ•„ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite( [
{ updateMany :
{
"filter" : <document>,
"update" : <document or pipeline>,
"upsert" : <boolean>,
"collation": <document>,
"arrayFilters": [ <filterdocument1>, ... ],
"hint": <document|string>
}
}
] )
ํ•„๋“œ
์ฐธ๊ณ  ์‚ฌํ•ญ

filter

์—…๋ฐ์ดํŠธ์˜ ์„ ํƒ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์ฟผ๋ฆฌ ์„ ํƒ๊ธฐ๋ฅผ db.collection.find() ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

update

์ˆ˜ํ–‰ํ•  ์—…๋ฐ์ดํŠธ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

upsert

์„ ํƒ ์‚ฌํ•ญ. ์—…์„œํŠธ๋ฅผ ์ˆ˜ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ upsert๋Š” false์ž…๋‹ˆ๋‹ค.

arrayFilters

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

collation

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

hint

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. filter ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด ์—ฐ์‚ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ db.collection.updateOne() ๋ฐ db.collection.updateMany()๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

replaceOne์€ ํ•„ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ replaceOne์€ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ๋งŒ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite([
{ replaceOne :
{
"filter" : <document>,
"replacement" : <document>,
"upsert" : <boolean>,
"collation": <document>,
"hint": <document|string>
}
}
] )
ํ•„๋“œ
์ฐธ๊ณ  ์‚ฌํ•ญ

filter

๊ต์ฒด ์ž‘์—…์˜ ์„ ํƒ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. db.collection.find() ๋ฉ”์„œ๋“œ์—์„œ์™€ ๋™์ผํ•œ ์ฟผ๋ฆฌ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

replacement

๋Œ€์ฒด ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ์—๋Š” ์—…๋ฐ์ดํŠธ ์—ฐ์‚ฐ์ž๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

upsert

์„ ํƒ ์‚ฌํ•ญ. ์—…์„œํŠธ๋ฅผ ์ˆ˜ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€์šธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ upsert๋Š” false์ž…๋‹ˆ๋‹ค.

collation

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

hint

์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. filter ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด ์—ฐ์‚ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ db.collection.replaceOne()์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

deleteOne์€ ํ•„ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๋‹จ์ผ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ deleteOne์€ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์„œ๋งŒ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite([
{ deleteOne : {
"filter" : <document>,
"collation" : <document> // Available starting in 3.4
} }
] )

deleteMany ํ•„ํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite([
{ deleteMany: {
"filter" : <document>,
"collation" : <document> // Available starting in 3.4
} }
] )
ํ•„๋“œ
์ฐธ๊ณ  ์‚ฌํ•ญ

filter

์‚ญ์ œ ์ž‘์—…์˜ ์„ ํƒ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. db.collection.find() ๋ฉ”์„œ๋“œ์—์„œ์™€ ๋™์ผํ•œ ์ฟผ๋ฆฌ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

collation

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

์ž์„ธํ•œ ๋‚ด์šฉ์€ db.collection.deleteOne() ๋ฐ db.collection.deleteMany()๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฌธ์„œ์— _id ํ•„๋“œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ mongod์—์„œ _id ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ฝ์ž… ๋˜๋Š” ์—…์„œํŠธํ•˜๊ธฐ ์ „์— ๋ฌธ์„œ์— ๊ณ ์œ ํ•œ ObjectId()๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ObjectId๋ฅผ ์ƒ์„ฑํ•˜๊ณ  _id ํ•„๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€๋งŒ, ๋“œ๋ผ์ด๋ฒ„๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ mongod์—์„œ _id๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฑ„์›๋‹ˆ๋‹ค.

๋ฌธ์„œ์— _id ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ค‘๋ณต ํ‚ค ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด _id ๊ฐ’์ด ์ปฌ๋ ‰์…˜ ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ต์ฒด ์ž‘์—…์—์„œ๋Š” ์›๋ณธ ๋ฌธ์„œ์™€ ๋‹ค๋ฅธ _id ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ordered ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” bulkWrite()์ด ์ž‘์—…์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—…์€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์—ฐ์‚ฐ์ด 5๊ฐœ ํฌํ•จ๋œ bulkWrite()๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

db.collection.bulkWrite(
[
{ insertOne : <document> },
{ updateOne : <document> },
{ updateMany : <document> },
{ replaceOne : <document> },
{ deleteOne : <document> },
{ deleteMany : <document> }
]
)

๊ธฐ๋ณธ๊ฐ’ ordered : true ์ƒํƒœ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ์—ฐ์‚ฐ insertOne๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์—ฐ์‚ฐ deleteMany๊นŒ์ง€ ๊ฐ ์—ฐ์‚ฐ์ด ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ordered๋ฅผ ๊ฑฐ์ง“์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด mongod๋กœ ์ž‘์—… ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ž‘์—… ์‹คํ–‰ ์ˆœ์„œ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์—ฐ์‚ฐ 6๊ฐœ๊ฐ€ ํฌํ•จ๋œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ bulkWrite()๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

db.collection.bulkWrite(
[
{ insertOne : <document> },
{ updateOne : <document> },
{ updateMany : <document> },
{ replaceOne : <document> },
{ deleteOne : <document> },
{ deleteMany : <document> }
],
{ ordered : false }
)

ordered : false์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด deleteOne ๋˜๋Š” deleteMany๋Š” insertOne, updateOne, updateMany ๋˜๋Š” replaceOne ์ž‘์—…์˜ ์ด์ „ ๋˜๋Š” ์ดํ›„ ์‹คํ–‰ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ๋ฌธ์„œ ๋˜๋Š” ๋” ์ ์€ ๋ฌธ์„œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๊ทธ๋ฃน์˜ ์ž‘์—… ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ maxWriteBatchSize ๊ฐ’์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. maxWriteBatchSize์˜ ๊ธฐ๋ณธ๊ฐ’์€ 100,000์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ hello.maxWriteBatchSize ํ•„๋“œ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ์ œํ•œ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน์ด ์ด ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ทธ๋ฃน์„ ์ œํ•œ ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜์˜ ์ž‘์€ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด maxWriteBatchSize ๊ฐ’์ด 100,000์ธ ๊ฒฝ์šฐ ๋Œ€๊ธฐ์—ด์ด 200,000๊ฐœ์˜ ์ž‘์—…์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฐ๊ฐ 100,000๊ฐœ์˜ ์ž‘์—…์ด ์žˆ๋Š” 2๊ฐœ์˜ ๊ทธ๋ฃน์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ด ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ณ ๊ธ‰ API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋งŒ ๊ทธ๋ฃน์„ ์ž‘์€ ๊ทธ๋ฃน ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. db.runCommand()์„(๋ฅผ) ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด(์˜ˆ์‹œ: ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž‘์„ฑํ•  ๋•Œ) ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์“ฐ๊ธฐ ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ MongoDB์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ๋ฐฐ์น˜์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ณด๊ณ ์„œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๋ฉด MongoDB๋Š” ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ž๋ฆ…๋‹ˆ๋‹ค. ์ด ํฌ๊ธฐ๊ฐ€ 1MB๋ณด๋‹ค ํฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์œผ๋ฉด ์ž˜๋ฆฝ๋‹ˆ๋‹ค.

ํฌ๊ธฐ ๋ฐ ๊ทธ๋ฃนํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‚ด๋ถ€ ์„ฑ๋Šฅ ์„ธ๋ถ€ ์ •๋ณด์ด๋ฉฐ ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒค๋“œ ์ปฌ๋ ‰์…˜์—์„œ ordered ์ž‘์—… ๋ชฉ๋ก์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ unordered ๋ชฉ๋ก์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ์ •๋ ฌ๋œ ๋ชฉ๋ก์—์„œ๋Š” ๊ฐ ์ž‘์—…์ด ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

bulkWrite() ์“ฐ๊ธฐ ์ž‘์—…์€ ๊ณ ์ • ์‚ฌ์ด์ฆˆ ์ปฌ๋ ‰์…˜์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

update ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ˆ˜์ •๋˜๋Š” ๋ฌธ์„œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด updateOne ๋ฐ updateMany์€ WriteError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค

replaceOne์€ replacement ๋ฌธ์„œ์˜ ํฌ๊ธฐ๊ฐ€ ์›๋ณธ ๋ฌธ์„œ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ WriteError์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

deleteOne ๋ฐ deleteMany์€ ๊ณ ์ • ์‚ฌ์ด์ฆˆ ์ปฌ๋ ‰์…˜์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ WriteError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

bulkWrite() ์“ฐ๊ธฐ ์ž‘์—…์€ time series ์ปฌ๋ ‰์…˜์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. time series ์ปฌ๋ ‰์…˜์—๋Š” insertOne ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์ž‘์—…์€ WriteError๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

db.collection.bulkWrite()๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ BulkWriteError ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

์“ฐ๊ธฐ ๊ณ ๋ ค ์˜ค๋ฅ˜๋Š” writeConcernErrors ํ•„๋“œ์— ํ‘œ์‹œ๋˜๊ณ  ๊ธฐํƒ€ ๋ชจ๋“  ์˜ค๋ฅ˜๋Š” writeErrors ํ•„๋“œ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž…๋ ฅ๋œ _id ๊ฐ’ ๋Œ€์‹  ์„ฑ๊ณตํ•œ ์“ฐ๊ธฐ ์—ฐ์‚ฐ์˜ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์ง€์ •๋œ ์—ฐ์‚ฐ์—์„œ๋Š” ๋ฐœ์ƒํ•œ ๋‹จ์ผ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•œํŽธ ์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์—ฐ์‚ฐ์—์„œ๋Š” ๊ฐ ์˜ค๋ฅ˜๊ฐ€ ํ•œ ๋ฐฐ์—ด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜ ์—์„œ ์Šคํ‚ค๋งˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  validationAction ์ด(๊ฐ€) error(์œผ)๋กœ ์„ค์ •ํ•˜๋‹ค ๊ฒฝ์šฐ ์ž˜๋ชป๋œ ๋ฌธ์„œ ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๊ฐ’์œผ๋กœ ๋ฌธ์„œ ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. operations ๋ฐฐ์—ด ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ์—ฐ์‚ฐ ์•ž์— ์žˆ๋Š” ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜์–ด ์ปฌ๋ ‰์…˜ ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ordered ํ•„๋“œ ๋Š” ๋‚˜๋จธ์ง€ ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

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

์ค‘์š”

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

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

๊ธฐ๋Šฅ ํ˜ธํ™˜์„ฑ ๋ฒ„์ „(fcv) "4.4" ์ด์ƒ์˜ ๊ฒฝ์šฐ, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ํŠธ๋žœ์žญ์…˜์—์„œ upsert: true๋กœ ์‚ฝ์ž… ์—ฐ์‚ฐ ๋˜๋Š” ์—…๋ฐ์ดํŠธ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ฉด ์ปฌ๋ ‰์…˜์ด ์•”์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

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

ํŠธ๋žœ์žญ์…˜์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ํŠธ๋žœ์žญ์…˜์— ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๋ฐ ์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 4.2๋ถ€ํ„ฐ db.collection.bulkWrite() ์—ฐ์‚ฐ์ด ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด ๋ฉ”์„œ๋“œ๋Š”(ํŠธ๋žœ์žญ์…˜ ์™ธ๋ถ€์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ) BulkWriteException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

4.0์—์„œ๋Š” bulkWrite ์—ฐ์‚ฐ์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๊ฐ€ BulkWriteException(์œผ)๋กœ ๋ž˜ํ•‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€๋Ÿ‰ ์“ฐ๊ธฐ์˜ ์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ๋Š” ๋Œ€๋Ÿ‰ ์“ฐ๊ธฐ์˜ ์ฒซ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋Œ€๋Ÿ‰ ์“ฐ๊ธฐ ์ „์ฒด๊ฐ€ ์‹คํŒจํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

bulkWrite() ์ž‘์—… ์ˆœ์„œ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ bulkWrite() (์€)๋Š” ์ˆœ์„œ๊ฐ€ ์ง€์ •๋œ ์ž‘์—… ๋ชฉ๋ก์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—…์€ ์—ฐ์†์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ์ž‘์—…์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ž‘์—…๊ณผ ์ดํ›„ ์ž‘์—…์€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜ ์ž‘์—… ์ด์ „์— ๋‚˜์—ด๋œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ bulkWrite() ์˜ˆ์‹œ์—์„œ๋Š” pizzas ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )

๋‹ค์Œ bulkWrite() ์˜ˆ์‹œ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ pizzas ์ปฌ๋ ‰์…˜์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • 0}์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.insertOne

  • 0}์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.updateOne

  • 0}์„(๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.deleteOne

  • 0}์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.replaceOne

try {
db.pizzas.bulkWrite( [
{ insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },
{ insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } } },
{ updateOne: {
filter: { type: "cheese" },
update: { $set: { price: 8 } }
} },
{ deleteOne: { filter: { type: "pepperoni"} } },
{ replaceOne: {
filter: { type: "vegan" },
replacement: { type: "tofu", size: "small", price: 4 }
} }
] )
} catch( error ) {
print( error )
}

์™„๋ฃŒ๋œ ์ž‘์—…์˜ ์š”์•ฝ์„ ํฌํ•จํ•˜๋Š” ์˜ˆ์‹œ ์ถœ๋ ฅ:

{
acknowledged: true,
insertedCount: 2,
insertedIds: { '0': 3, '1': 4 },
matchedCount: 2,
modifiedCount: 2,
deletedCount: 1,
upsertedCount: 0,
upsertedIds: {}
}

์ด์ „ bulkWrite() ์˜ˆ์‹œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ปฌ๋ ‰์…˜์— _id๊ฐ€ 4์ธ ๋ฌธ์„œ๊ฐ€ ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ insertOne ์ž‘์—…์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘๋ณต ํ‚ค ์˜ˆ์™ธ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

writeErrors: [
WriteError {
err: {
index: 1,
code: 11000,
errmsg: 'E11000 duplicate key error collection: test.pizzas index: _id_ dup key: { _id: 4 }',
op: { _id: 4, type: 'sausage', size: 'large', price: 10 }
}
}
],
result: BulkWriteResult {
result: {
ok: 1,
writeErrors: [
WriteError {
err: {
index: 1,
code: 11000,
errmsg: 'E11000 duplicate key error collection: test.pizzas index: _id_ dup key: { _id: 4 }',
op: { _id: 4, type: 'sausage', size: 'large', price: 10 }
}
}
],
writeConcernErrors: [],
insertedIds: [ { index: 0, _id: 3 }, { index: 1, _id: 4 } ],
nInserted: 1,
nUpserted: 0,
nMatched: 0,
nModified: 0,
nRemoved: 0,
upserted: []
}
}

bulkWrite() ์˜ˆ์‹œ๋Š” ์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ insertOne ์ž‘์—…๋งŒ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋ ค๋ฉด ordered๋ฅผ false๋กœ ์„ค์ •ํ•œ ์ƒํƒœ์—์„œ bulkWrite()๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ bulkWrite()๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด ordered๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ bulkWrite() ์—ฐ์‚ฐ ๋ชฉ๋ก์—์„œ:

pizzas collection ์˜ˆ์‹œ๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ collection์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )

๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • bulkWrite()๋Š” pizzas ์ปฌ๋ ‰์…˜์—์„œ ์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‘ ๋ฒˆ์งธ insertOne ์ž‘์—…์—๋Š” ์ฒซ ๋ฒˆ์งธ insertOne ์™€ ๋™์ผํ•œ _id ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต ํ‚ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

try {
db.pizzas.bulkWrite( [
{ insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },
{ insertOne: { document: { _id: 3, type: "sausage", size: "large", price: 10 } } },
{ updateOne: {
filter: { type: "cheese" },
update: { $set: { price: 8 } }
} },
{ deleteOne: { filter: { type: "pepperoni"} } },
{ replaceOne: {
filter: { type: "vegan" },
replacement: { type: "tofu", size: "small", price: 4 }
} }
],
{ ordered: false } )
} catch( error ) {
print( error )
}

์ค‘๋ณต ํ‚ค ์˜ค๋ฅ˜์™€ ์™„๋ฃŒ๋œ ์ž‘์—…์˜ ์š”์•ฝ์„ ํฌํ•จํ•˜๋Š” ์˜ˆ์‹œ ์ถœ๋ ฅ:

writeErrors: [
WriteError {
err: {
index: 1,
code: 11000,
errmsg: 'E11000 duplicate key error collection: test.pizzas index: _id_ dup key: { _id: 3 }',
op: { _id: 3, type: 'sausage', size: 'large', price: 10 }
}
}
],
result: BulkWriteResult {
result: {
ok: 1,
writeErrors: [
WriteError {
err: {
index: 1,
code: 11000,
errmsg: 'E11000 duplicate key error collection: test.pizzas index: _id_ dup key: { _id: 3 }',
op: { _id: 3, type: 'sausage', size: 'large', price: 10 }
}
}
],
writeConcernErrors: [],
insertedIds: [ { index: 0, _id: 3 }, { index: 1, _id: 3 } ],
nInserted: 1,
nUpserted: 0,
nMatched: 2,
nModified: 2,
nRemoved: 1,
upserted: []
}
}

์ค‘๋ณต ํ‚ค ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋‘ ๋ฒˆ์งธ insertOne ์—ฐ์‚ฐ์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ bulkWrite()์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

pizzas collection ์˜ˆ์‹œ๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•˜์—ฌ collection์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )

๋‹ค์Œ bulkWrite() ์˜ˆ์‹œ์—์„œ๋Š” pizzas ์ปฌ๋ ‰์…˜์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  100๋ฐ€๋ฆฌ์ดˆ์˜ ์‹œ๊ฐ„ ์ œํ•œ์ด ์žˆ๋Š” "majority"์“ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

try {
db.pizzas.bulkWrite( [
{ updateMany: {
filter: { size: "medium" },
update: { $inc: { price: 0.1 } }
} },
{ updateMany: {
filter: { size: "small" },
update: { $inc: { price: -0.25 } }
} },
{ deleteMany: { filter: { size: "large" } } },
{ insertOne: {
document: { _id: 4, type: "sausage", size: "small", price: 12 }
} } ],
{ writeConcern: { w: "majority", wtimeout: 100 } }
)
} catch( error ) {
print( error )
}

๋Œ€๋ถ€๋ถ„์˜ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋…ธ๋“œ๊ฐ€ ์ž‘์—…์„ ํ™•์ธํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด wtimeout์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ˆ์‹œ์—์„œ๋Š” ์“ฐ๊ธฐ ๊ณ ๋ ค ์˜ค๋ฅ˜์™€ ์™„๋ฃŒ๋œ ์ž‘์—…์˜ ์š”์•ฝ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

result: BulkWriteResult {
result: {
ok: 1,
writeErrors: [],
writeConcernErrors: [
WriteConcernError {
err: {
code: 64,
codeName: 'WriteConcernTimeout',
errmsg: 'waiting for replication timed out',
errInfo: { wtimeout: true, writeConcern: [Object] }
}
}
],
insertedIds: [ { index: 3, _id: 4 } ],
nInserted: 0,
nUpserted: 0,
nMatched: 2,
nModified: 2,
nRemoved: 0,
upserted: [],
opTime: { ts: Timestamp({ t: 1660329086, i: 2 }), t: Long("1") }
}
}

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