Docs Menu
Docs Home
/ /
λ°°μ—΄

$[]

$[]

전체 μœ„μΉ˜ μ—°μ‚°μž $[] 은(λŠ”) μ—…λ°μ΄νŠΈ μ—°μ‚°μžκ°€ μ§€μ •λœ λ°°μ—΄ ν•„λ“œμ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μˆ˜μ •ν•΄μ•Ό 함을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

$[] μ—°μ‚°μžμ˜ ν˜•μ‹μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{ <update operator>: { "<array>.$[]" : value } }

μ—…λ°μ΄νŠΈ μž‘μ—…μ—μ„œ 예λ₯Ό λ“€μ–΄ db.collection.updateOne() 및 db.collection.findAndModify()λ₯Ό μ‚¬μš©ν•˜μ—¬ 쿼리 쑰건과 μΌμΉ˜ν•˜λŠ” λ¬Έμ„œμ— λŒ€ν•œ λͺ¨λ“  λ°°μ—΄ μš”μ†Œλ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€. μ˜ˆμ‹œ:

db.collection.updateOne(
{ <query conditions> },
{ <update operator>: { "<array>.$[]" : value } }
)

μ˜ˆμ‹œλŠ” λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œ μ—…λ°μ΄νŠΈλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

MongoDB 5.0λΆ€ν„° μ—…λ°μ΄νŠΈ μ—°μ‚°μžλŠ” λ¬Έμžμ—΄ 기반 이름이 μžˆλŠ” λ¬Έμ„œ ν•„λ“œλ₯Ό μ‚¬μ „μˆœμœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. 숫자 이름이 μžˆλŠ” ν•„λ“œλŠ” 숫자 μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ—…λ°μ΄νŠΈ 운영자 λ™μž‘μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ—…μ„œνŠΈ μ—°μ‚°μœΌλ‘œ 인해 μ‚½μž…μ΄ λ°œμƒν•˜λŠ” 경우 μ—…λ°μ΄νŠΈ λ¬Έμ—μ„œ $[] μœ„μΉ˜ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ query 에 λ°°μ—΄ ν•„λ“œμ— μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ” ν•­λͺ©μ΄ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, $[] λ¬Έμ„œμ—μ„œ μ—…μ„œνŠΈ μž‘μ—…μ€ λ°°μ—΄ ν•„λ“œμ— μ •ν™•ν•œ 동등성 맀치 쑰건을 μ§€μ •ν•©λ‹ˆλ‹€.

db.collection.updateOne(
{ myArray: [ 5, 8 ] },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)

ν•΄λ‹Ή λ¬Έμ„œκ°€ μ—†λŠ” 경우 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ λ‹€μŒ λ¬Έμ„œκ°€ μ‚½μž…λ©λ‹ˆλ‹€.

{ "_id" : ObjectId(...), "myArray" : [ 10, 10 ] }

μ—…μ„œνŠΈ μž‘μ—…μ— μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ” λ‚΄μš©μ΄ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šκ³  μ—…λ°μ΄νŠΈν•  μΌμΉ˜ν•˜λŠ” λ¬Έμ„œλ₯Ό μ°Ύμ§€ λͺ»ν•œ 경우 μ—…μ„œνŠΈ μž‘μ—…μ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ—…λ°μ΄νŠΈν•  μΌμΉ˜ν•˜λŠ” λ¬Έμ„œκ°€ μ—†μœΌλ©΄ λ‹€μŒ μž‘μ—…μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

db.emptyCollection.updateOne(
{ },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)
db.emptyCollection.updateOne(
{ myArray: 5 },
{ $set: { "myArray.$[]": 10 } },
{ upsert: true }
)

$[] μ—°μ‚°μžλŠ” λ‘˜ μ΄μƒμ˜ λ°°μ—΄κ³Ό 쀑첩 배열을 μˆœνšŒν•˜λŠ” 쿼리에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œλŠ” $[<identifier>]와 ν•¨κ»˜ 쀑첩 λ°°μ—΄ μ—…λ°μ΄νŠΈλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

students μ»¬λ ‰μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 85, 82, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

μ»¬λ ‰μ…˜μ˜ λͺ¨λ“  λ¬Έμ„œμ— λŒ€ν•΄ grades λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό 10 만큼 μ¦κ°€μ‹œν‚€λ €λ©΄ 전체 μœ„μΉ˜ $[] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

db.students.updateMany(
{ },
{ $inc: { "grades.$[]": 10 } },
)

λͺ¨λ“  μœ„μΉ˜ $[] μ—°μ‚°μžλŠ” λ°°μ—΄ ν•„λ“œμ˜ λͺ¨λ“  μš”μ†Œμ— λŒ€ν•œ 자리 ν‘œμ‹œμž 역할을 ν•©λ‹ˆλ‹€.

μž‘μ—… ν›„ students μ»¬λ ‰μ…˜μ—λŠ” λ‹€μŒ λ¬Έμ„œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }

$[] μœ„μΉ˜ μ—°μ‚°μžλŠ” λ‚΄μž₯된 λ¬Έμ„œλ₯Ό ν¬ν•¨ν•œ 배열을 κ°„νŽΈν•˜κ²Œ μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν¬ν•¨λœ λ¬Έμ„œμ˜ ν•„λ“œμ— μ•‘μ„ΈμŠ€ν•˜λ €λ©΄ $[] μ—°μ‚°μžμ™€ ν•¨κ»˜ 점 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

db.collection.updateOne(
{ <query selector> },
{ <update operator>: { "array.$[].field" : value } }
)

students2 μ»¬λ ‰μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

db.students2.insertMany( [
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 8 },
{ "grade" : 85, "mean" : 90, "std" : 6 },
{ "grade" : 85, "mean" : 85, "std" : 8 }
]
},
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 8 },
{ "grade" : 87, "mean" : 90, "std" : 5 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
}
] )

grades λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œμ— λŒ€ν•œ std ν•„λ“œ 값을 μˆ˜μ •ν•˜λ €λ©΄ μœ„μΉ˜ $[] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

db.students2.updateMany(
{ },
{ $inc: { "grades.$[].std" : -2 } },
)

μž‘μ—… ν›„ μ»¬λ ‰μ…˜μ—λŠ” λ‹€μŒ λ¬Έμ„œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.

{
"_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 }
]
}

results μ»¬λ ‰μ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

db.results.insertMany( [
{ "_id" : 1, "grades" : [ 85, 82, 80 ] },
{ "_id" : 2, "grades" : [ 88, 90, 92 ] },
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
] )

grades λ°°μ—΄μ—μ„œ 값이 100인 λ¬Έμ„œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  λ¬Έμ„œμ— λŒ€ν•΄ grades λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό 10μ”© μ¦κ°€μ‹œν‚€λ €λ©΄ λͺ¨λ“  μœ„μΉ˜ $[] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

db.results.updateMany(
{ "grades" : { $ne: 100 } },
{ $inc: { "grades.$[]": 10 } },
)

λͺ¨λ“  μœ„μΉ˜ $[] μ—°μ‚°μžλŠ” λ°°μ—΄ ν•„λ“œμ˜ λͺ¨λ“  μš”μ†Œμ— λŒ€ν•œ 자리 ν‘œμ‹œμž 역할을 ν•©λ‹ˆλ‹€.

μž‘μ—… ν›„ students μ»¬λ ‰μ…˜μ—λŠ” λ‹€μŒ λ¬Έμ„œκ°€ ν¬ν•¨λ©λ‹ˆλ‹€.

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 102 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }

ν•„ν„° $[<identifier>] μœ„μΉ˜ μ—°μ‚°μžμ™€ ν•¨κ»˜ $[] μœ„μΉ˜ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μ€‘μ²©λœ 배열을 μ—…λ°μ΄νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λ¬Έμ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¬λ ‰μ…˜ students3λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

db.students3.insertMany( [
{ "_id" : 1,
"grades" : [
{ type: "quiz", questions: [ 10, 8, 5 ] },
{ type: "quiz", questions: [ 8, 9, 6 ] },
{ type: "hw", questions: [ 5, 4, 3 ] },
{ type: "exam", questions: [ 25, 10, 23, 0 ] },
]
}
] )

type 에 관계없이 μ€‘μ²©λœ grades.questions λ°°μ—΄μ—μ„œ 8 보닀 ν¬κ±°λ‚˜ 같은 λͺ¨λ“  값을 μ—…λ°μ΄νŠΈν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ„Έμš”.

db.students3.updateMany(
{},
{ $inc: { "grades.$[].questions.$[score]": 2 } },
{ arrayFilters: [ { "score": { $gte: 8 } } ] }
)

μ—…λ°μ΄νŠΈλœ λ¬Έμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

{
_id: 1,
grades: [
{ type: 'quiz', questions: [ 12, 10, 5 ] },
{ type: 'quiz', questions: [ 10, 11, 6 ] },
{ type: 'hw', questions: [ 5, 4, 3 ] },
{ type: 'exam', questions: [ 27, 12, 25, 0 ] }
]
}

팁

λŒμ•„κ°€κΈ°

$ (update)

이 νŽ˜μ΄μ§€μ˜ λ‚΄μš©