$[]
정의
$[]
전체 위치 연산자
$[]
은(는) 업데이트 연산자가 지정된 배열 필드의 모든 요소를 수정해야 함을 나타냅니다.$[]
연산자의 형식은 다음과 같습니다.{ <update operator>: { "<array>.$[]" : value } } 업데이트 작업에서 예를 들어
db.collection.updateOne()
및db.collection.findAndModify()
를 사용하여 쿼리 조건과 일치하는 문서에 대한 모든 배열 요소를 수정합니다. 예시:db.collection.updateOne( { <query conditions> }, { <update operator>: { "<array>.$[]" : value } } ) 예시는 배열의 모든 요소 업데이트를 참조하세요.
행동
MongoDB 5.0부터 업데이트 연산자는 문자열 기반 이름이 있는 문서 필드를 사전순으로 처리합니다. 숫자 이름이 있는 필드는 숫자 순서대로 처리됩니다. 자세한 내용은 업데이트 운영자 동작을 참조하십시오.
upsert
업서트 연산으로 인해 삽입이 발생하는 경우 업데이트 문에서 $[]
위치 연산자를 사용하려면 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>]
필터 $[<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 ] } ] }