db.collection.findAndModify()
๋๋ผ์ด๋ฒ๊ฐ ํฌํจ๋ MongoDB
์ด ํ์ด์ง์์๋ mongosh
๋ฉ์๋์ ๋ํด ์ค๋ช
ํฉ๋๋ค. MongoDB ๋๋ผ์ด๋ฒ์์ ๋์ผํ ๋ฉ์๋๋ฅผ ๋ณด๋ ค๋ฉด ํด๋น ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํด๋น ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
์ ์
db.collection.findAndModify(document)
์ค์
๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ mongosh ๋ฉ์๋
๋์
findOneAndUpdate()
,findOneAndDelete()
๋๋findOneAndReplace()
์(๋ฅผ) ์ฌ์ฉํ์ธ์.๋จ์ผ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ฐํํฉ๋๋ค. ๋ฐํ๋ ๋ฌธ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ฐ์ดํธ ์ ์์ ๋ ๋ด์ฉ์ด ํฌํจ๋์ง ์์ต๋๋ค. ์ ๋ฐ์ดํธ์ ๋ํ ์์ ์ฌํญ์ด ์๋ ๋ฌธ์๋ฅผ ๋ฐํํ๋ ค๋ฉด
new
์ต์ ์ ์ฌ์ฉํฉ๋๋ค.
ํธํ์ฑ
๋ค์ ํ๊ฒฝ์์ ํธ์คํ
๋๋ ๋ฐฐํฌ์ db.collection.findAndModify()
์ฌ์ฉํ ์ ์์ต๋๋ค.
MongoDB Atlas: ํด๋ผ์ฐ๋์์์ MongoDB ๋ฐฐํฌ๋ฅผ ์ํ ์์ ๊ด๋ฆฌํ ์๋น์ค
MongoDB Enterprise: MongoDB์ ๊ตฌ๋ ๊ธฐ๋ฐ ์์ฒด ๊ด๋ฆฌ ๋ฒ์
MongoDB Community: MongoDB์ ์์ค ์ฌ์ฉ ๊ฐ๋ฅ ๋ฌด๋ฃ ์์ฒด ๊ด๋ฆฌ ๋ฒ์
๊ตฌ๋ฌธ
๋ฒ์ 5.0์์ ๋ณ๊ฒฝ๋จ
findAndModify()
๋ฉ์๋์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
db.collection.findAndModify({ query: <document>, sort: <document>, remove: <boolean>, update: <document or aggregation pipeline>, new: <boolean>, fields: <document>, upsert: <boolean>, bypassDocumentValidation: <boolean>, writeConcern: <document>, maxTimeMS: <integer>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], let: <document> // Added in MongoDB 5.0 });
db.collection.findAndModify()
๋ฉ์๋๋ ๋ค์์ ๋ด์ฅ๋ ๋ฌธ์ ํ๋๋ก ๋ฌธ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Parameter | ์ ํ | ์ค๋ช
| ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ๋ฌธ์ | ์ ํ ์ฌํญ. ์์ ์ ์ํ ์ ํ ๊ธฐ์ค์
๋๋ค. ํ๋ ์ง์ ํ์ง ์์ผ๋ฉด ๋น ๋ฌธ์๋ก ๊ธฐ๋ณธ ์ค์ ๋ฉ๋๋ค. ์ฟผ๋ฆฌ ์ธ์๊ฐ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. | ||||||||||||||||||
| ๋ฌธ์ | ์ ํ ์ฌํญ. ์ฟผ๋ฆฌ ์ฌ๋ฌ ๋ฌธ์๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ ์์
์ ์
๋ฐ์ดํธํ ๋ฌธ์ ๊ฒฐ์ ํฉ๋๋ค. ์ ๋ ฌ ์ธ์๊ฐ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. MongoDB๋ ํน์ ์์์ ๋ฐ๋ผ ๋ฌธ์๋ฅผ ์ปฌ๋ ์ ์ ์ ์ฅํ์ง ์์ต๋๋ค. ์ค๋ณต ๊ฐ์ด ํฌํจ๋ ํ๋๋ฅผ ์ ๋ ฌํ ๋ ํด๋น ๊ฐ์ด ํฌํจ๋ ๋ฌธ์๋ ์์์ ์์๋ก ๋ฐํ๋ ์ ์์ต๋๋ค. ์ผ๊ด์ ์ธ ์ ๋ ฌ ์์๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ณ ์ ๊ฐ์ด ํฌํจ๋ ํ๋๋ฅผ ์ ๋ ฌ์ ํ๋ ์ด์ ํฌํจํ์ธ์. ์ด๋ฅผ ๋ณด์ฅํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๋ ฌ ์ฟผ๋ฆฌ์ ์์ธํ ๋ด์ฉ์ Sort Consistency(์ ๋ ฌ ์ผ๊ด์ฑ)์(๋ฅผ) ์ฐธ์กฐํ์ธ์. | ||||||||||||||||||
| ๋ถ์ธ |
| ||||||||||||||||||
| ๋ฌธ์ ๋๋ ๋ฐฐ์ด |
| ||||||||||||||||||
| ๋ถ์ธ | ์ ํ ์ฌํญ. | ||||||||||||||||||
| ๋ฌธ์ | ์ ํ ์ฌํญ์
๋๋ค. ๋ฐํํ ํ๋์ ํ์ ์ธํธ์
๋๋ค.
| ||||||||||||||||||
| ๋ถ์ธ | ์ ํ ์ฌํญ.
์
์ํธ๊ฐ ์ฌ๋ฌ ๋ฒ ๊ธฐ๋ณธ๊ฐ์ | ||||||||||||||||||
| ๋ถ์ธ | ์ ํ ์ฌํญ. ๋ฒ์ 3.2์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. | ||||||||||||||||||
| ๋ฌธ์ | ์ ํ ์ฌํญ์ ๋๋ค. ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ํํํ๋ ๋ฌธ์์ ๋๋ค. ๊ธฐ๋ณธ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด ์๋ตํ์ธ์. ํธ๋์ญ์ ์์ ์คํ๋๋ ๊ฒฝ์ฐ ์์ ์ ๋ํ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ๋ง์ธ์. ํธ๋์ญ์ ์ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํธ๋์ญ์ ๋ฐ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฐธ์กฐํ์ธ์. ๋ฒ์ 3.2์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. | ||||||||||||||||||
| non-negative integer | ์ ํ ์ฌํญ. ์๊ฐ ์ ํ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ ํฉ๋๋ค. MongoDB๋ | ||||||||||||||||||
| ๋ฌธ์ | ์ ํ ์ฌํญ. ์์ ์ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค. ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ฉด ๋์๋ฌธ์ ๋ฐ ์ ์ผํธ ํ์ ๊ท์น๊ณผ ๊ฐ์ ๋ฌธ์์ด ๋น๊ต์ ๋ํ ์ธ์ด๋ณ ๊ท์น์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ๋ ฌ ์ต์ ์ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ๋ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์ง์ ๋์ง ์์์ง๋ง ์ปฌ๋ ์
์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์๋ ๊ฒฝ์ฐ( ์ปฌ๋ ์ ๋๋ ์ฐ์ฐ์ ๋ํ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, MongoDB๋ ์ด์ ๋ฒ์ ์์ ๋ฌธ์์ด ๋น๊ต์ ์ฌ์ฉ๋ ๊ฐ๋จํ ์ด์ง ๋น๊ต๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ์ฐ์ฐ์ ๋ํด ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๋๋ณ๋ก ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ง์ ํ ์ ์์ผ๋ฉฐ ์ ๋ ฌ๊ณผ ํจ๊ป ์ฐพ๊ธฐ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ์ ์ ๋ ฌ์์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค. ๋ฒ์ 3.4์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. | ||||||||||||||||||
| ๋ฐฐ์ด | ์ ํ ์ฌํญ์ ๋๋ค. ํํฐ ๋ฌธ์์ ๋ฐฐ์ด๋ก, ๋ฐฐ์ด ํ๋์ ๋ํ ์ ๋ฐ์ดํธ ์์ ์ ์ํด ์์ ํ ๋ฐฐ์ด ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์
๋ฐ์ดํธ ๋ฌธ์์์
์
๋ฐ์ดํธ ๋ฌธ์์ ๋์ผํ ์๋ณ์๋ฅผ ์ฌ๋ฌ ๋ฒ ํฌํจํ ์ ์์ง๋ง, ์
๋ฐ์ดํธ ๋ฌธ์์ ๊ฐ ๊ณ ์ ์๋ณ์(
๊ทธ๋ฌ๋ ๋ค์ ์์์ ๊ฐ์ด ๋จ์ผ ํํฐ ๋ฌธ์์์ ๋์ผํ ์๋ณ์์ ๋ณตํฉ ์กฐ๊ฑด์ ์ง์ ํ ์ ์์ต๋๋ค.
์์ ๋ ์ฐธ๊ณ์ง๊ณ ํ์ดํ๋ผ์ธ ์ ์ฌ์ฉํ๋ ์
๋ฐ์ดํธ์๋ ๋ฒ์ 3.6์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค. | ||||||||||||||||||
๋ฌธ์ | ์ ํ ์ฌํญ. ๋ณ์ ๋ชฉ๋ก์ด ์๋ ๋ฌธ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฟผ๋ฆฌ ํ ์คํธ์์ ๋ณ์๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ช ๋ น ๊ฐ๋ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๋ณ์๋ ํํ์์์ ๋ฐํ๋ ๊ฐ์ผ๋ก ์ค์ ๋๋ฉฐ ์ดํ์๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๋ช
๋ น์์ ๋ณ์ ๊ฐ์ ์ก์ธ์คํ๋ ค๋ฉด ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๋ ค๋ฉด ๋ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ ์ฒด ์์ ๋ฒ์ 5.0์ ์ถ๊ฐ. |
๋ฐ์ดํฐ ๋ฐํํ๊ธฐ
์ ๊ฑฐ ์ฐ์ฐ์์ ์ฟผ๋ฆฌ๊ฐ ๋ฌธ์์ ์ผ์นํ๋ฉด findAndModify()
์ด(๊ฐ) ์ ๊ฑฐ๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ฟผ๋ฆฌ๊ฐ ์ ๊ฑฐํ ๋ฌธ์์ ์ผ์นํ์ง ์์ผ๋ฉด findAndModify()
์ด(๊ฐ) null
(์)๋ฅผ ๋ฐํํฉ๋๋ค.
์
๋ฐ์ดํธ ์ฐ์ฐ์์ findAndModify()
๋ ๋ค์ ์ค ํ ๊ฐ์ง๋ฅผ ๋ฐํํฉ๋๋ค.
new
๋งค๊ฐ๋ณ์๊ฐ ์ค์ ๋์ง ์์๊ฑฐ๋false
์ธ ๊ฒฝ์ฐ:์ฟผ๋ฆฌ๊ฐ ๋ฌธ์์ ์ผ์นํ๋ฉด ์์ ์ ๋ฌธ์๊ฐ ๋ํ๋ฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด
null
์ด(๊ฐ) ํ์๋ฉ๋๋ค.
new
๊ฐtrue
์ธ ๊ฒฝ์ฐ:์ฟผ๋ฆฌ๊ฐ ์ผ์นํ๋ ํญ๋ชฉ์ ๋ฐํํ๋ฉด ์ ๋ฐ์ดํธ๋ ๋ฌธ์๊ฐ ํ์๋ฉ๋๋ค.
upsert: true
(์ด)๋ฉด์ ์ฟผ๋ฆฌ์ ์ผ์นํ๋ ๋ฌธ์๊ฐ ์์ผ๋ฉด ์ฝ์ ๋ ๋ฌธ์๊ฐ ๋ํ๋ฉ๋๋ค.๊ทธ๋ ์ง ์์ผ๋ฉด
null
์ด(๊ฐ) ํ์๋ฉ๋๋ค.
ํ๋
fields
ํ๋ก์ ์
์ค์
์ธ์ด ์ผ๊ด์ฑ
find()
๋ฐ findAndModify()
ํ๋ก์ ์
์ ์ง๊ณ์ $project
๋จ๊ณ์ ์ผ์น์ํค๋ ์์
์ ์ผํ์ผ๋ก,
find()
๋ฐfindAndModify()
ํ๋ก์ ์ ์ ์ง๊ณ ํํ์๊ณผ ๊ตฌ๋ฌธ์ ํ์ฉํ ์ ์์ต๋๋ค.MongoDB๋ ํ๋ก์ ์ ๊ณผ ๊ด๋ จํ์ฌ ์ถ๊ฐ ์ ํ ์ฌํญ์ ์ํํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ํ๋ก์ ์ ์ ํ ์ฌํญ์ ์ฐธ์กฐํ์ธ์.
fields
์ต์
์์๋ ๋ค์ ํ์์ ๋ฌธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
{ field1: <value>, field2: <value> ... }
ํ๋ก์ ์
| ์ค๋ช
|
---|---|
| ํ๋ ํฌํจ ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ํ๋ก์ ์
๊ฐ์ 0์ด ์๋ ์ ์๋ฅผ ์ง์ ํ๋ฉด ์ฐ์ฐ์ ํด๋น ๊ฐ์ |
| ํ๋ ์ ์ธ ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. |
| |
| ๋ฐฐ์ด ํ๋ก์ ์
์ฐ์ฐ์( ๋ทฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
| ํ๋ก์ ์ ๋ ํ๋์ ๊ฐ์ ์ง์ ํฉ๋๋ค. ๋ฆฌํฐ๋ด ๋ฐ ์ง๊ณ ๋ณ์ ์ฌ์ฉ์ ํฌํจํ ์ง๊ณ ์ ๋ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ ํ๋๋ฅผ ํ๋ก์ ์ ํ๊ฑฐ๋ ๊ธฐ์กด ํ๋๋ฅผ ์ ๊ฐ์ผ๋ก ํ๋ก์ ์ ํ ์ ์์ต๋๋ค.
|
์๋ฒ ๋๋ ํ๋ ์ง์
๋ด์ฅ๋ ๋ฌธ์์ ํ๋์ ๋ํด์๋ ๋ค์ ๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์ ํ๊ธฐ๋ฒ(์์:
"field.nestedfield": <value>
์ค์ฒฉ๋ ์์(์:
{ field: { nestedfield: <value> } }
)
_id
ํ๋ ํ๋ก์ ์
ํ๋๋ฅผ ํ์ํ์ง ์๊ธฐ ์ํด ํ๋ก์ ์
์์ _id: 0
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์๋ ํ _id
ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐํ๋ ๋ฌธ์์ ํฌํจ๋ฉ๋๋ค.
ํฌํจ ๋๋ ์ ์ธ
projection
ํ๋๋ ํฌํจ๊ณผ ์ ์ธ ์ฌ์์ ๋ชจ๋ ํฌํจํ ์ ์์ต๋๋ค. ๋จ, _id
ํ๋๋ ์์ธ์
๋๋ค.
ํ๋๋ฅผ ๋ช ์์ ์ผ๋ก ํฌํจํ๋ ํ๋ก์ ์ ์์
_id
ํ๋๋ ๋ช ์์ ์ผ๋ก ์ ์ธํ ์ ์๋ ์ ์ผํ ํ๋์ ๋๋ค.ํ๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํ๋ ํ๋ก์ ์ ์์๋
_id
ํ๋๊ฐ ๋ช ์์ ์ผ๋ก ํฌํจํ ์ ์๋ ์ ์ผํ ํ๋์ด์ง๋ง,_id
ํ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋ฉ๋๋ค.
ํ๋ก์ ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์ ์น์ ๋ ๊ฐ์ด ์ฐธ์กฐํ์ธ์.
๊ณ ์ ์ธ๋ฑ์ค๊ฐ ํฌํจ๋ ์ ์ํธ
์ค๋ณต์ ๋ฐฉ์งํ๋ ๊ณ ์ ์ธ๋ฑ์ค ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ํธ๋ ์ค๋ณต ๋ฌธ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ด๋ฆ์ด Andy
์ธ ๋ฌธ์๊ฐ ์๊ณ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋๋ต ๋์์ ๋ค์ ๋ช
๋ น์ ์คํํ๋ ์์๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
db.people.findAndModify( { query: { name: "Andy" }, update: { $inc: { score: 1 } }, upsert: true } )
ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฝ์
ํ๊ธฐ ์ ์ ๋ชจ๋ findOneAndUpdate()
์์
์ด ์ฟผ๋ฆฌ ๋จ๊ณ๋ฅผ ์๋ฃ ํ๊ณ name
ํ๋์ ๊ณ ์ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, findOneAndUpdate()
์์
๋ง๋ค ์ฝ์
์ด ๋ฐ์ํ์ฌ name: Andy
์ด ํฌํจ๋ ์ฌ๋ฌ ๋ฌธ์๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค.
name
ํ๋์ ๋ํ ๊ณ ์ ์ธ๋ฑ์ค๋ ํ๋์ ๋ฌธ์๋ง ์์ฑ๋๋๋ก ํฉ๋๋ค. ๊ณ ์ ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋๋ฉด ์ด์ ์ฌ๋ฌ findOneAndUpdate()
์์
์์ ๋ค์๊ณผ ๊ฐ์ ๋์์ด ๋ฐ์ํฉ๋๋ค.
findOneAndUpdate()
๋ฒ์์ฐ์ฐ์ ์ ํํ ํ ๋ฒ ์คํํ๋ฉด ์ ๋ฌธ์๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค.
๋ค๋ฅธ
findOneAndUpdate()
์์ ์ ์๋ก ์ฝ์ ๋ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๊ณ ์ ํค ์ถฉ๋๋ก ์ธํด ์คํจํฉ๋๋ค.๋ค๋ฅธ
findOneAndUpdate()
์์ ์์ ์๋ก ์ฝ์ ๋ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๋ค์ ์กฐ๊ฑด์ด ๋ชจ๋ ์ถฉ์กฑ๋์ด์ผ ํฉ๋๋ค.target collection์ ์ค๋ณต ํค ์ค๋ฅ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๊ณ ์ ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค.
์ ๋ฐ์ดํธ ์์ ์ด
updateMany
์ด ์๋๊ฑฐ๋multi
์ดfalse
์ ๋๋ค.์ ๋ฐ์ดํธ ์ผ์น ์กฐ๊ฑด์ ๋ ์ค ํ๋์ ๋๋ค:
๋จ์ผ ๋๋ฑ์ฑ ์กฐ๊ฑด์. ์์:
{ "fieldA" : "valueA" }
.๋๋ฑ์ฑ ์กฐ๊ฑด์์ ๋ ผ๋ฆฌ์ AND. ์์:
{ "fieldA" : "valueA", "fieldB" : "valueB" }
.
๋๋ฑ์ฑ ์กฐ๊ฑด์์ ํ๋๋ ๊ณ ์ ์ธ๋ฑ์ค ํค ํจํด์ ํ๋์ ์ผ์นํฉ๋๋ค.
์ ๋ฐ์ดํธ ์์ ์ ๊ณ ์ ์ธ๋ฑ์ค ํค ํจํด์ ํ๋๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
๋ค์ ํ๋ ํค ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์
๋ฐ์ดํธ๋ฅผ ์ด๋ํ๊ฑฐ๋ ์คํจํ๋ upsert
์์
์ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๊ณ ์ ์ธ๋ฑ์ค ํค ํจํด | ์
๋ฐ์ดํธ ์์
| ๊ฒฐ๊ณผ | ||||||
---|---|---|---|---|---|---|---|---|
|
| ์ผ์นํ๋ ๋ฌธ์์ | ||||||
|
| ๊ณ ์ ์ธ๋ฑ์ค ํค ํจํด( | ||||||
|
| ๋๋ฑ์ฑ ์กฐ๊ฑด์ ํ๋( |
์ค๋ ์ปฌ๋ ์
์ค๋ ์ปฌ๋ ์
์์ findAndModify
์(๋ฅผ) ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋ฐฉ๋ฒ๋๋ก ํ์ธ์.
์ค๋ 1๊ฐ๋ง์ ๋์์ผ๋ก ํ๋ ๊ฒฝ์ฐ
query
ํ๋์ ๋ถ๋ถ ์ค๋ ํค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋,query
ํ๋์ ์ ์ฒด ์ค๋ ํค์ ๋ํ ๋๋ฑ์ฑ ์กฐ๊ฑด์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ค๋ฉ๋ ์ปฌ๋ ์
์ ๋ฌธ์์๋ ์ค๋ ํค ํ๋๊ฐ ๋๋ฝ ๋ ์ ์์ต๋๋ค. ์ค๋ ํค๊ฐ ์๋ ๋ฌธ์๋ฅผ ๋์์ผ๋ก ์ง์ ํ๋ ค๋ฉด null
๋๋ฑ์ฑ ๋งค์น๋ฅผ ๋ค๋ฅธ ํํฐ ์กฐ๊ฑด(์์: _id
ํ๋)๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
์ค๋ ํค ์์
์ค๋ ํค ํ๋๊ฐ ๋ณ๊ฒฝํ ์ ์๋ _id
ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์์ ์ค๋ ํค ๊ฐ์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๊ฒฝ๊ณ
์ค๋ฉ๋ ์ปฌ๋ ์ ์ ๋ฌธ์์๋ ์ค๋ ํค ํ๋๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. ๋ฌธ์์ ์ค๋ ํค ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์ค์๋ก ์ค๋ ํค๋ฅผ ์ ๊ฑฐํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๊ธฐ์กด ์ค๋ ํค ๊ฐ์ db.collection.findAndModify()
๋ก ์
๋ฐ์ดํธํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
๋ฐ๋์
mongos
์์ ์คํํด์ผ ํฉ๋๋ค. ์ค๋์์ ์ง์ ์์ ์ ์คํํ์ง ์์์ผ ํฉ๋๋ค.๋ฐ๋์ ํธ๋์ญ์ ์์ ์คํํ๊ฑฐ๋ ์ฌ์๋ ๊ฐ๋ฅ ์ฐ๊ธฐ๋ก ์คํํด์ผ ํฉ๋๋ค .
์ ์ฒด ์ค๋ ํค์ ๋๋ฑ์ฑ ํํฐ๋ฅผ ํฌํจ์์ผ์ผ ํฉ๋๋ค.
๋๋ฝ๋ ์ค๋ ํค
์ค๋ฉ๋ ์ปฌ๋ ์
์ ๋ฌธ์์๋ ์ค๋ ํค ํ๋๊ฐ ๋๋ฝ๋ ์ ์์ต๋๋ค. db.collection.findAndModify()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ ๋๋ฝ๋ ์ค๋ ํค๋ฅผ ์ค์ ํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
๋ฐ๋์
mongos
์์ ์คํํด์ผ ํฉ๋๋ค. ์ค๋์์ ์ง์ ์์ ์ ์คํํ์ง ์์์ผ ํฉ๋๋ค.์ ์ค๋ ํค ๊ฐ์ด
null
์ด(๊ฐ) ์๋ ๊ฒฝ์ฐ ํธ๋์ญ์ ๋๋ ์ฌ์๋ ๊ฐ๋ฅ ์ฐ๊ธฐ ์ค ํ๋๋ก ์คํํด์ผํฉ๋๋ค.
์ ์ฒด ์ค๋ ํค์ ๋๋ฑ์ฑ ํํฐ๋ฅผ ํฌํจ์์ผ์ผ ํฉ๋๋ค.
ํ
๋๋ฝ๋ ํค ๊ฐ์ null ๋๋ฑ์ฑ ๋งค์น์ ์ผ๋ถ๋ก ๋ฐํ๋๋ฏ๋ก null ๊ฐ ํค๊ฐ ์
๋ฐ์ดํธ๋์ง ์๋๋ก ํ๋ ค๋ฉด ์ถ๊ฐ ์ฟผ๋ฆฌ ์กฐ๊ฑด(์: _id
ํ๋)์ ์ ์ ํ ํฌํจํ์ธ์.
๋ค์๋ ์ฐธ์กฐํ์ธ์.
๋ฌธ์ ์ ํจ์ฑ ๊ฒ์ฌ
db.collection.findAndModify()
๋ฉ์๋๋ ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ด ์๋ ์ปฌ๋ ์
์ ๋ฌธ์๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ์
๋ฐ์ดํธํ ๋ ๋ฌธ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฑด๋๋ธ ์ ์๋
bypassDocumentValidation
์ต์
์ ๋ํ ์ง์์ ์ถ๊ฐํฉ๋๋ค.
update
๋ฉ์๋์์ ๋น๊ต
๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํ ๋ db.collection.findAndModify()
๋ฉ์๋์ updateOne()
๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ก ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค.
์ฌ๋ฌ ๋ฌธ์๊ฐ ์ ๋ฐ์ดํธ ๊ธฐ์ค๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ
db.collection.findAndModify()
์sort
๋ฅผ ์ง์ ํ์ฌ ์ ๋ฐ์ดํธํ ๋ฌธ์์ ์ ์ด ์๋จ์ ์ ๊ณตํ ์ ์์ต๋๋ค.updateOne()
์(๋) ์ผ์นํ๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.db.collection.findAndModify()
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋ฌธ์์ ์์ ์ ๋ฒ์ ์ ๋ฐํํฉ๋๋ค. ์ ๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ๋ฐ์ผ๋ ค๋ฉดnew
์ต์ ์ ์ฌ์ฉํ์ธ์.updateOne()
๋ฉ์๋๋ ์ฐ์ฐ์ ์ํ๊ฐ ํฌํจ๋WriteResult()
๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.์ ๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ๋ฐํํ๋ ค๋ฉด
find()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ธ์. ๊ทธ๋ฌ๋ ์ ๋ฐ์ดํธ์ ๋ฌธ์ ๊ฒ์ ์ฌ์ด์ ๋ค๋ฅธ ์ ๋ฐ์ดํธ๋ก ์ธํด ๋ฌธ์๊ฐ ์์ ๋์์ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ํด๋น ์ ๋ฐ์ดํธ๋ก ์ธํด ๋ฌธ์๊ฐ 1๊ฐ๋ง ์์ ๋์์ผ๋ ์ฌ๋ฌ ๋ฌธ์๊ฐ ์ผ์นํ ๊ฒฝ์ฐ, ์ ๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ์๋ณํ๊ธฐ ์ํด์๋ ์ถ๊ฐ ๋ก์ง์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋จ์ผ ๋ฌธ์๋ฅผ ์์ ํ ๋๋ db.collection.findAndModify()
๋ฉ์๋ ๋ฐ updateOne()
๋ฉ์๋ ๋ ๋ค ๋ฌธ์๋ฅผ ์์ ๋จ์๋ก ์
๋ฐ์ดํธํฉ๋๋ค. ์ด ๋ฉ์๋๋ค์ ์ํธ์์ฉ๊ณผ ์ฐ์ฐ ์์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์์์ฑ ๋ฐ ํธ๋์ญ์
์ ์ฐธ์กฐํ์ธ์.
ํธ๋์ญ์
db.collection.findAndModify()
๋ ๋ถ์ฐ ํธ๋์ญ์
๋ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ถ์ฐ ํธ๋์ญ์ ์ ๋จ์ผ ๋ฌธ์ ์ฐ๊ธฐ์ ๋นํด ๋ ํฐ ์ฑ๋ฅ ๋น์ฉ์ด ๋ฐ์ํ๋ฏ๋ก ๋ถ์ฐ ํธ๋์ญ์ ์ ๊ฐ์ฉ์ฑ์ด ํจ๊ณผ์ ์ธ ์คํค๋ง ์ค๊ณ๋ฅผ ๋์ฒดํ ์๋ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์๋๋ฆฌ์ค์์ ๋น์ ๊ทํ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ (๋ด์ฅ๋ ๋ฌธ์ ๋ฐ ๋ฐฐ์ด) ์ ๊ณ์ํด์ ๋ฐ์ดํฐ ๋ฐ ์ฌ์ฉ ์ฌ๋ก์ ์ต์ ์ผ ๊ฒ์ ๋๋ค. ์ฆ, ๋๋ถ๋ถ์ ์๋๋ฆฌ์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ฒ ๋ชจ๋ธ๋งํ๋ฉด ๋ถ์ฐ ํธ๋์ญ์ ์ ํ์์ฑ์ด ์ต์ํ๋ฉ๋๋ค.
์ถ๊ฐ ํธ๋์ญ์ ์ฌ์ฉ ๊ณ ๋ ค ์ฌํญ(์: ๋ฐํ์ ์ ํ ๋ฐ oplog ํฌ๊ธฐ ์ ํ)์ ํ๋ก๋์ ๊ณ ๋ ค์ฌํญ์ ์ฐธ์กฐํ์ธ์.
ํธ๋์ญ์ ๋ด ์ ์ํธ
ํธ๋์ญ์ ์ด ๊ต์ฐจ ์ค๋ ์ฐ๊ธฐ ํธ๋์ญ์ (write transaction)์ด ์๋ ๊ฒฝ์ฐ ๋ถ์ฐ ํธ๋์ญ์ ๋ด์์ ์ปฌ๋ ์ ๊ณผ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
upsert: true
์ธ
db.collection.findAndModify()
๋ ๊ธฐ์กด ์ปฌ๋ ์
์ด๋ ์กด์ฌํ์ง ์๋ ์ปฌ๋ ์
์์ ์คํ๋ ์ ์์ต๋๋ค. ์กด์ฌํ์ง ์๋ ์ปฌ๋ ์
์์ ์คํํ๋ฉด ์์
์ด ์ปฌ๋ ์
์ ๋ง๋ญ๋๋ค.
๋ค์๋ ์ฐธ์กฐํ์ธ์.
์ฐ๊ธฐ ๊ณ ๋ ค ๋ฐ ํธ๋์ญ์
ํธ๋์ญ์ ์์ ์คํ๋๋ ๊ฒฝ์ฐ ์์ ์ ๋ํ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ๋ง์ธ์. ํธ๋์ญ์ ์ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํธ๋์ญ์ ๋ฐ ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฐธ์กฐํ์ธ์.
oplog ํญ๋ชฉ
db.collection.findAndModify()
์์
์ด ๋ฌธ์๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฐพ์์ ์์ ํ๋ฉด ์์
์ oplog(์์
๋ก๊ทธ)์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค. ์์
์ด ์คํจํ๊ฑฐ๋ ์์ ํ ๋ฌธ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์์
์ oplog์ ํญ๋ชฉ์ ์ถ๊ฐํ์ง ์์ต๋๋ค.
์ฐ๋ ค ์ฌํญ ์ค๋ฅ ์ฐ๊ธฐ
MongoDB ์์ 5.0 findAndModify
๋ช
๋ น์ด ์ค๋ฉ๋ ํด๋ฌ์คํฐ ์์ ์คํmongos
๋๋ ๊ฒฝ์ฐ,writeConcernError
์ค๋ ์๋ต์ ์ค๋ฅ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๊ฐ ๋ฌธ์ ์ญ์ ํฉ๋๋ค.
์์
์ ๋ฐ์ดํธ ๋ฐ ๋ฐํ
๋ค์ ๋ฉ์๋๋ ๋ฌธ์๊ฐ ์ฟผ๋ฆฌ ๊ธฐ์ค๊ณผ ์ผ์นํ๋ ์ฌ๋ ์ปฌ๋ ์ ์ ๊ธฐ์กด ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ฐํํฉ๋๋ค.
db.people.findAndModify({ query: { name: "Tom", state: "active", rating: { $gt: 10 } }, sort: { rating: 1 }, update: { $inc: { score: 1 } } })
์ด ๋ฉ์๋๋ ๋ค์ ์์ ์ ์คํํฉ๋๋ค.
query
์(๋)name
ํ๋์ ๊ฐ์ดTom
(์ด)๊ณ ,state
ํ๋์ ๊ฐ์ดactive
(์ด)๊ณ ,rating
ํ๋์ ๊ฐ์ด 10greater than
์ธ
people
์ปฌ๋ ์ ์์ ๋ฌธ์๋ฅผ ์ฐพ์ต๋๋ค.
sort
์(๋) ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ์ฌ๋ฌ ๋ฌธ์๊ฐquery
์กฐ๊ฑด์ ์ถฉ์กฑํ ๊ฒฝ์ฐ, ์ด ๋ฉ์๋๋ ์ดsort
(์ผ)๋ก ์ ๋ ฌ๋ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ฅผ ์์ ํ๊ธฐ๋ก ์ ํํฉ๋๋ค.increments
์(๋)score
ํ๋์ ๊ฐ์ 1์ฉ ์ ๋ฐ์ดํธํฉ๋๋ค.์ด ๋ฉ์๋๋ ์ด ์ ๋ฐ์ดํธ๋ฅผ ์ํด ์ ํ๋ ์๋ณธ(์ฆ ์์ ์ ) ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : ObjectId("50f1e2c99beb36a0f45c6453"), "name" : "Tom", "state" : "active", "rating" : 100, "score" : 5 } ์ ๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ๋ฐํํ๋ ค๋ฉด ๋ฉ์๋์
new:true
์ต์ ์ ์ถ๊ฐํฉ๋๋ค.query
์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๋ฌธ์๊ฐ ์์ ๊ฒฝ์ฐ ์ด ๋ฉ์๋๋null
์(๋ฅผ) ๋ฐํํฉ๋๋ค.
์ ์ํธ
๋ค์ ๋ฉ์๋์๋ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋, ์ผ์นํ๋ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๋ฌธ์๋ฅผ ์์ฑํ๋ update
์ฐ์ฐ์ upsert: true
์ต์
์ด ํฌํจ๋์ด ์์ต๋๋ค.
db.people.findAndModify({ query: { name: "Gus", state: "active", rating: 100 }, sort: { rating: 1 }, update: { $inc: { score: 1 } }, upsert: true })
์ด ๋ฉ์๋๊ฐ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์ฐพ์ผ๋ฉด ์ ๋ฐ์ดํธ๊ฐ ์คํ๋ฉ๋๋ค.
์ด ๋ฉ์๋๊ฐ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด ์ ๋ฌธ์๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด ๋ฉ์๋์ sort
์ต์
์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋น ๋ฌธ์ { }
์ด(๊ฐ) ์๋ณธ(์์ ์ ) ๋ฌธ์๋ก ๋ฐํ๋ฉ๋๋ค.
{ }
์ด ๋ฉ์๋์ sort
์ต์
์ด ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ์๋
null
์ด(๊ฐ) ๋ฐํ๋ฉ๋๋ค.
null
์ ๋ฌธ์ ๋ฐํํ๊ธฐ
๋ค์ ๋ฉ์๋์๋ upsert: true
์ต์
๊ณผ new:true
์ต์
์ด ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์
๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ๋ฐํํ๊ฑฐ๋, ์ผ์นํ๋ ๋ฌธ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์๋ฅผ ์ฝ์
ํ๊ณ ์๋ก ์ฝ์
๋ ๋ฌธ์๋ฅผ value
ํ๋์ ๋ฐํํฉ๋๋ค.
๋ค์ ์์์์๋ people
์ปฌ๋ ์
์ ์ด๋ค ๋ฌธ์๋ query
์กฐ๊ฑด๊ณผ ์ผ์นํ์ง ์์ต๋๋ค.
db.people.findAndModify({ query: { name: "Pascal", state: "active", rating: 25 }, sort: { rating: 1 }, update: { $inc: { score: 1 } }, upsert: true, new: true })
์ด ๋ฉ์๋๋ ์๋ก ์ฝ์ ๋ ๋ฌธ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํํฉ๋๋ค.
{ "_id" : ObjectId("50f49ad6444c11ac2448a5d6"), "name" : "Pascal", "rating" : 25, "score" : 1, "state" : "active" }
์ ๋ ฌ ๋ฐ ์ ๊ฑฐ
๋ค์ ์์์์๋ rating
ํ๋์ sort
์ฌ์์ ํฌํจ์ํด์ผ๋ก์จ, state
๊ฐ์ด active
(์ด)๋ฉด์ ์ผ์นํ๋ ๋ฌธ์ ์ค rating
๊ฐ์ด ๊ฐ์ฅ ๋ฎ์ ๋จ์ผ ๋ฌธ์๋ฅผ people
์ปฌ๋ ์
์์ ์ ๊ฑฐํฉ๋๋ค.
db.people.findAndModify( { query: { state: "active" }, sort: { rating: 1 }, remove: true } )
์ด ๋ฉ์๋๋ ์ญ์ ๋ ๋ฌธ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํํฉ๋๋ค.
{ "_id" : ObjectId("52fba867ab5fdca1299674ad"), "name" : "XYZ123", "score" : 1, "state" : "active", "rating" : 3 }
๋ฐ์ดํฐ ์ ๋ ฌ ์ง์
๋ฒ์ 3.4์ ์๋ก ์ถ๊ฐ๋์์ต๋๋ค.
๋ฐ์ดํฐ ์ ๋ ฌ์ ์ฌ์ฉํ๋ฉด ๋์๋ฌธ์ ๋ฐ ์ ์ผํธ ํ์ ๊ท์น๊ณผ ๊ฐ์ ๋ฌธ์์ด ๋น๊ต์ ๋ํ ์ธ์ด๋ณ ๊ท์น์ ์ง์ ํ ์ ์์ต๋๋ค.
์ปฌ๋ ์
myColl
์๋ ๋ค์ ๋ฌธ์๊ฐ ์์ต๋๋ค.
{ _id: 1, category: "cafรฉ", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
๋ค์ ์์ ์๋ ๋ฐ์ดํฐ ์ ๋ ฌ ์ต์ ์ด ํฌํจ๋ฉ๋๋ค.
db.myColl.findAndModify({ query: { category: "cafe", status: "a" }, sort: { category: 1 }, update: { $set: { status: "Updated" } }, collation: { locale: "fr", strength: 1 } });
์ฐ์ฐ์ ๋ค์ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
{ "_id" : 1, "category" : "cafรฉ", "status" : "A" }
๋ฐฐ์ด ์
๋ฐ์ดํธ ์์
์ arrayFilters
์ง์
์ฐธ๊ณ
์ง๊ณ ํ์ดํ๋ผ์ธ ์ ์ฌ์ฉํ๋ ์
๋ฐ์ดํธ์๋ arrayFilters
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐฐ์ด ํ๋๋ฅผ ์
๋ฐ์ดํธํ ๋ ์
๋ฐ์ดํธํ ๋ฐฐ์ด ์์๋ฅผ ๊ฒฐ์ ํ๋ arrayFilters
๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์
๋ฐ์ดํธ ์์๊ฐ arrayFilters
๊ธฐ์ค๊ณผ ์ผ์นํจ
์ฐธ๊ณ
์ง๊ณ ํ์ดํ๋ผ์ธ ์ ์ฌ์ฉํ๋ ์
๋ฐ์ดํธ์๋ arrayFilters
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์
students
๋ฅผ ์์ฑํฉ๋๋ค.
db.students.insertMany( [ { "_id" : 1, "grades" : [ 95, 92, 90 ] }, { "_id" : 2, "grades" : [ 98, 100, 102 ] }, { "_id" : 3, "grades" : [ 95, 110, 100 ] } ] )
grades
๋ฐฐ์ด์์ 100
๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์๋ฅผ ๋ชจ๋ ์
๋ฐ์ดํธํ๋ ค๋ฉด ํํฐ๋ง๋ ์์น ์ฐ์ฐ์ $[<identifier>]
์(๋ฅผ) db.collection.findAndModify()
๋ฉ์๋์
arrayFilters
์ต์
๊ณผ ํจ๊ป ์ฌ์ฉํ์ธ์.
db.students.findAndModify({ query: { grades: { $gte: 100 } }, update: { $set: { "grades.$[element]" : 100 } }, arrayFilters: [ { "element": { $gte: 100 } } ] })
์ด ์ฐ์ฐ์ ๋จ์ผ ๋ฌธ์์ grades
ํ๋๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค. ์ฐ์ฐ์ด ์๋ฃ๋ ํ ์ปฌ๋ ์
์ ํฌํจ๋๋ ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 110, 100 ] }
๋ฌธ์ ๋ฐฐ์ด์ ํน์ ์์ ์ ๋ฐ์ดํธ
์ฐธ๊ณ
์ง๊ณ ํ์ดํ๋ผ์ธ ์ ์ฌ์ฉํ๋ ์
๋ฐ์ดํธ์๋ arrayFilters
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์
students2
๋ฅผ ์์ฑํฉ๋๋ค.
db.students2.insertMany( [ { "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 90, "std" : 4 }, { "grade" : 85, "mean" : 85, "std" : 6 } ] }, { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] } ] )
๋ค์ ์์
์ ํ๋๊ฐ ์ธ ๋ฌธ์๋ฅผ ์ฐพ๊ณ _id
1
ํํฐ๋ง๋ ์์น ์ฐ์ฐ์ ๋ฅผ ์ ํจ๊ป $[<identifier>]
์ฌ์ฉํ์ฌ arrayFilters
mean
grades
๋ฑ๊ธ์ด ๋ ๋์ ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ๋ํด ๋ฅผ 85
์
๋ฐ์ดํธํฉ๋๋ค. ์ด์์
๋๋ค.
db.students2.findAndModify({ query: { _id : 1 }, update: { $set: { "grades.$[elem].mean" : 100 } }, arrayFilters: [ { "elem.grade": { $gte: 85 } } ] })
์ด ์ฐ์ฐ์ ๋จ์ผ ๋ฌธ์์ grades
ํ๋๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค. ์ฐ์ฐ์ด ์๋ฃ๋ ํ ์ปฌ๋ ์
์ ํฌํจ๋๋ ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{ "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 100, "std" : 4 }, { "grade" : 85, "mean" : 100, "std" : 6 } ] } { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] }
์ ๋ฐ์ดํธ์ ์ง๊ณ ํ์ดํ๋ผ์ธ ์ฌ์ฉํ๊ธฐ
db.collection.findAndModify()
๋ ์
๋ฐ์ดํธ๋ฅผ ์ํ ์ง๊ณ ํ์ดํ๋ผ์ธ์ ์ธ์๋ก ๋ฐ์ ์ ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ๋ค์ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
$addFields
๋ฐ ๋ณ์นญ$set
$replaceRoot
๋ฐ ๋ณ์นญ$replaceWith
์ ๋๋ค.
์ง๊ณ ํ์ดํ๋ผ์ธe์ ์ฌ์ฉํ๋ฉด ํ์ฌ ํ๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์กฐ๊ฑด๋ถ ์ ๋ฐ์ดํธ๋ฅผ ํํํ๊ฑฐ๋ ๋ค๋ฅธ ํ๋์ ๊ฐ์ ์ฌ์ฉํ์ฌ ํ ํ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฑ ๋ณด๋ค ํํ๋ ฅ์ด ํ๋ถํ ์ ๋ฐ์ดํธ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์์ต๋๋ค.
๊ทธ ์๋ก ๋ค์ ๋ฌธ์๋ฅผ ์ฌ์ฉํด students2
์ปฌ๋ ์
์ ์์ฑํ์ธ์.
db.students2.insertMany( [ { "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 90, "std" : 4 }, { "grade" : 85, "mean" : 85, "std" : 6 } ] }, { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] } ] )
๋ค์ ์ฐ์ฐ์ _id
ํ๋๊ฐ 1
์ธ ๋ฌธ์๋ฅผ ์ฐพ๊ณ , ์ง๊ณ ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ์ฌ grades
ํ๋์์ ์ ํ๋ total
์(๋ฅผ) ๊ณ์ฐํฉ๋๋ค.
db.students2.findAndModify( { query: { "_id" : 1 }, update: [ { $set: { "total" : { $sum: "$grades.grade" } } } ], // The $set stage is an alias for ``$addFields`` stage new: true } )
์ฐธ๊ณ
์ด ์ฐ์ฐ์ ์ ๋ฐ์ดํธ๋ ๋ฌธ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํํฉ๋๋ค.
{ "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 6 }, { "grade" : 85, "mean" : 90, "std" : 4 }, { "grade" : 85, "mean" : 85, "std" : 6 } ], "total" : 250 }
let
์์ ๋ณ์ ์ฌ์ฉ
๋ฒ์ 5.0์ ์ถ๊ฐ.
๋ช ๋ น์ ๋ค๋ฅธ ๊ณณ์์ ์ก์ธ์คํ ์ ์๋ ๋ณ์๋ฅผ ์ ์ํ๋ ค๋ฉด let ์ต์ ์ ์ฌ์ฉํฉ๋๋ค.
์ฐธ๊ณ
๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํ๋ ค๋ฉด $expr
์ฐ์ฐ์ ๋ด์์ ๋ณ์์ ์ก์ธ์คํด์ผ ํฉ๋๋ค.
์ปฌ๋ ์
cakeFlavors
์ ๋ง๋ญ๋๋ค:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
๋ค์ ์์์์๋ let
์ targetFlavor
๋ณ์๋ฅผ ์ ์ํ๊ณ , ์ด ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์ดํฌ ๋ง์ ์ฒด๋ฆฌ์์ ์ค๋ ์ง๋ก ๋ณ๊ฒฝํฉ๋๋ค.
db.cakeFlavors.findAndModify( { query: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, update: { flavor: "orange" }, let: { targetFlavor: "cherry" } } )