$[<identifier>]
이 페이지의 내용
정의
$[<identifier>]
필터링된 위치 연산자
$[<identifier>]
는 업데이트 연산에 대해arrayFilters
조건과 일치하는 배열 요소를 식별합니다(예:db.collection.updateMany()
및db.collection.findAndModify()
).arrayFilters
옵션과 함께 사용되는$[<identifier>]
연산자의 형식은 다음과 같습니다.{ <update operator>: { "<array>.$[<identifier>]" : value } }, { arrayFilters: [ { <identifier>: <condition> } ] } arrayFilters
옵션과 함께 사용하면 문서의 11arrayFilters`` 조건과 일치하는 모든 요소 또는 쿼리 조건과 일치하는 문서를 업데이트할 수 있습니다. 예를 들면 다음과 같습니다.db.collection.updateMany( { <query conditions> }, { <update operator>: { "<array>.$[<identifier>]" : value } }, { arrayFilters: [ { <identifier>: <condition> } ] } ) 참고
<identifier>
는 소문자로 시작해야 하며 영숫자만 포함할 수 있습니다.예시의 경우
arrayFilters
와 일치하는 모든 배열 요소 업데이트를 참조하세요.
행동
MongoDB 5.0부터 업데이트 연산자는 문자열 기반 이름이 있는 문서 필드를 사전순으로 처리합니다. 숫자 이름이 있는 필드는 숫자 순서대로 처리됩니다. 자세한 내용은 업데이트 운영자 동작을 참조하십시오.
제한 사항
arrayFilters
옵션에는 다음 쿼리 연산자를 포함할 수 없습니다.
upsert
작업으로 인해 삽입이 발생하는 경우 업데이트 문에서 $[<identifier>]
를 사용하려면 query
에 배열 필드와 정확한 동등성 매치 항목이 포함되어야 합니다.
예를 들어, $[<identifier>]
문서에서 업서트 작업은 배열 필드에 정확한 동등성 매치 조건을 지정합니다.
db.collection.updateOne( { myArray: [ 0, 1 ] }, { $set: { "myArray.$[element]": 2 } }, { arrayFilters: [ { element: 0 } ], upsert: true } )
해당 문서가 없는 경우 작업을 수행하면 다음과 유사한 문서가 삽입됩니다.
{ "_id" : ObjectId(...), "myArray" : [ 2, 1 ] }
업서트 작업에 정확히 일치하는 내용이 포함되어 있지 않고 업데이트할 일치하는 문서를 찾지 못한 경우 업서트 작업에 오류가 발생합니다. 예를 들어 업데이트할 일치하는 문서가 없으면 다음 작업에서 오류가 발생합니다.
db.array.updateOne( { }, { $set: { "myArray.$[element]": 10 } }, { arrayFilters: [ { element: 9 } ], upsert: true } )
이 작업은 다음과 유사한 오류를 반환합니다.
MongoServerError: The path 'myArray' must exist in the document in order to apply array updates.
중첩 배열
필터링된 위치 연산자 $[<identifier>]
는 둘 이상의 배열과 중첩 배열을 트래버스하는 쿼리에 사용할 수 있습니다.
예시는 $[]
와 함께 중첩 배열 업데이트를 참조하세요.
예시
일치하는 모든 배열 요소 업데이트 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>]
를 arrayFilters
와 함께 사용합니다.
db.students.updateMany( { }, { $set: { "grades.$[element]" : 100 } }, { arrayFilters: [ { "element": { $gte: 100 } } ] } )
위치 $[<identifier>]
연산자는 arrayFilters
에 지정된 조건과 일치하는 배열 필드의 모든 요소에 대한 자리 표시자 역할을 합니다.
작업 후 students
컬렉션에는 다음 문서가 포함됩니다.
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 100, 100 ] }
배열에서 와 일치하는 arrayFilters
모든 문서 업데이트
$[<identifier>]
연산자를 사용하면 내장된 문서가 포함된 배열을 쉽게 업데이트할 수 있습니다. 내장된 문서의 필드에 액세스하려면 점 표기법과 $[<identifier>]
를 함께 사용하세요.
db.collection.updateMany( { <query selector> }, { <update operator>: { "array.$[<identifier>].field" : value } }, { arrayFilters: [ { <identifier>: <condition> } } ] } )
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 } ] } ] )
등급이 85
보다 크거나 같은 grades
배열의 모든 요소에 대한 mean
필드의 값을 수정하려면 위치 $[<identifier>]
연산자 및 arrayFilters
(을)를 사용합니다.
db.students2.updateMany( { }, { $set: { "grades.$[elem].mean" : 100 } }, { arrayFilters: [ { "elem.grade": { $gte: 85 } } ] } )
작업 후 컬렉션에는 다음 문서가 포함됩니다.
{ "_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" : 100, "std" : 6 }, { "grade" : 87, "mean" : 100, "std" : 3 }, { "grade" : 85, "mean" : 100, "std" : 4 } ] }
여러 조건과 일치하는 모든 배열 요소 업데이트하기
students3
컬렉션을 생성합니다.
db.students3.insertMany( [ { "_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" : 100, "std" : 6 }, { "grade" : 87, "mean" : 100, "std" : 3 }, { "grade" : 85, "mean" : 100, "std" : 4 } ] } ] )
등급이 80
보다 크거나 같고 std
(이)가 5
보다 크거나 같은 grades
배열의 모든 요소에 대한 std
필드의 값을 수정하려면 위치 $[<identifier>]
연산자 및 arrayFilters
(을)를 사용합니다.
db.students3.updateMany( { }, { $inc: { "grades.$[elem].std" : -1 } }, { arrayFilters: [ { "elem.grade": { $gte: 80 }, "elem.std": { $gte: 5 } } ] } )
작업 후 컬렉션에는 다음 문서가 포함됩니다.
{ "_id" : 1, "grades" : [ { "grade" : 80, "mean" : 75, "std" : 5 }, { "grade" : 85, "mean" : 100, "std" : 4 }, { "grade" : 85, "mean" : 100, "std" : 5 } ] } { "_id" : 2, "grades" : [ { "grade" : 90, "mean" : 100, "std" : 5 }, { "grade" : 87, "mean" : 100, "std" : 3 }, { "grade" : 85, "mean" : 100, "std" : 4 } ] }
부정 연산자를 사용하여 배열 요소 업데이트하기
alumni
컬렉션을 생성합니다.
db.alumni.insertMany( [ { "_id": 1, "name": "Christine Franklin", "degrees": [ { "level": "Master" }, { "level": "Bachelor" } ], }, { "_id": 2, "name": "Reyansh Sengupta", "degrees": [ { "level": "Bachelor" } ], } ] )
degrees
배열에서 "level": "Bachelor"
가 없는 모든 요소를 수정하려면 $ne
쿼리 연산자와 함께 위치 $[<identifier>]
연산을 사용합니다.
db.alumni.updateMany( { }, { $set : { "degrees.$[degree].gradcampaign" : 1 } }, { arrayFilters : [ {"degree.level" : { $ne: "Bachelor" } } ] } )
작업 후 컬렉션에는 다음 문서가 포함됩니다.
{ _id: 1, name: 'Christine Franklin', degrees: [ { level: 'Master', gradcampaign: 1 }, { level: 'Bachelor' } ] }, { _id: 2, name: 'Reyansh Sengupta', degrees: [ { level: 'Bachelor' } ] }
다음과 함께 중첩 배열을 업데이트합니다. $[]
$[<identifier>]
필터링된 위치 연산자는 $[]
모든 위치 연산자와 함께 중첩된 배열을 업데이트하는 데 사용할 수 있습니다.
다음 문서를 사용하여 collection students4
을 만듭니다.
db.students4.insertOne( { "_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 ] }, ] } )
다음은 관련 grades.type
필드가 quiz
인 경우 중첩된 grades.questions
배열의 8
이상인 값을 업데이트합니다.
db.students4.updateMany( {}, { $inc: { "grades.$[t].questions.$[score]": 2 } }, { arrayFilters: [ { "t.type": "quiz" }, { "score": { $gte: 8 } } ] } )
참고
배열 식별자 주위에 공백을 추가하지 마십시오. 이전 예시에서 grades.$[ t ].questions.$[ score ]
을 사용한 경우 예시가 실패합니다.
작업 후 collection에는 다음과 같은 문서가 있습니다.
{ "_id" : 1, "grades" : [ { "type" : "quiz", "questions" : [ 12, 10, 5 ] }, { "type" : "quiz", "questions" : [ 10, 11, 6 ] }, { "type" : "hw", "questions" : [ 5, 4, 3 ] }, { "type" : "exam", "questions" : [ 25, 10, 23, 0 ] } ] }
type
에 관계없이 중첩된 grades.questions
배열에서 8
보다 크거나 같은 모든 값을 업데이트하려면 다음을 수행하세요.
db.students4.updateMany( {}, { $inc: { "grades.$[].questions.$[score]": 2 } }, { arrayFilters: [ { "score": { $gte: 8 } } ] } )