$[<identifier> ]
이 페이지의 내용
정의
$[<identifier>]
The filtered positional operator
$[<identifier>]
identifies the array elements that match thearrayFilters
conditions for an update operation, e.g.db.collection.updateMany()
anddb.collection.findAndModify()
.Used in conjunction with the
arrayFilters
option, the$[<identifier>]
operator has the following form:{ <update operator>: { "<array>.$[<identifier>]" : value } }, { arrayFilters: [ { <identifier>: <condition> } ] } Use in conjunction with the
arrayFilters
option to update all elements that match thearrayFilters
conditions in the document or documents that match the query conditions. For example:db.collection.updateMany( { <query conditions> }, { <update operator>: { "<array>.$[<identifier>]" : value } }, { arrayFilters: [ { <identifier>: <condition> } ] } ) 참고
<identifier>
는 소문자로 시작해야 하며 영숫자만 포함할 수 있습니다.For an example, see Update All Array Elements That Match
arrayFilters
.
행동
MongoDB 5.0부터 업데이트 연산자는 문자열 기반 이름이 있는 문서 필드를 사전순으로 처리합니다. 숫자 이름이 있는 필드는 숫자 순서대로 처리됩니다. 자세한 내용은 업데이트 운영자 동작을 참조하십시오.
제한 사항
The arrayFilters
option cannot include the following query
operators:
upsert
If an 업서트 operation results in an insert, the query
must
include an exact equality match on the array
field in order to use $[<identifier>]
in the update statement.
For example, the following upsert operation, which uses $[<identifier>]
in the update document, specifies an exact equality match condition
on the array field:
db.collection.updateOne( { myArray: [ 0, 1 ] }, { $set: { "myArray.$[element]": 2 } }, { arrayFilters: [ { element: 0 } ], upsert: true } )
If no such document exists, the operation would result in an insert of a document that resembles the following:
{ "_id" : ObjectId(...), "myArray" : [ 2, 1 ] }
If the upsert operation did not include an exact equality match and no matching documents were found to update, the upsert operation would error. For example, the following operations would error if no matching documents were found to update:
db.array.updateOne( { }, { $set: { "myArray.$[element]": 10 } }, { arrayFilters: [ { element: 9 } ], upsert: true } )
The operation would return an error that resembles the following:
MongoServerError: The path 'myArray' must exist in the document in order to apply array updates.
중첩 배열
The filtered positional operator $[<identifier>]
can
be used for queries which traverse more than one array and nested arrays.
예시는 $[]
와 함께 중첩 배열 업데이트를 참조하세요.
예시
Update All Array Elements That Match arrayFilters
students
컬렉션을 생성합니다.
db.students.insertMany( [ { "_id" : 1, "grades" : [ 95, 92, 90 ] }, { "_id" : 2, "grades" : [ 98, 100, 102 ] }, { "_id" : 3, "grades" : [ 95, 110, 100 ] } ] )
To update all elements that are greater than or equal to 100
in the
grades
array, use the filtered positional operator
$[<identifier>]
with the arrayFilters
:
db.students.updateMany( { }, { $set: { "grades.$[element]" : 100 } }, { arrayFilters: [ { "element": { $gte: 100 } } ] } )
The positional $[<identifier>]
operator acts as a placeholder for
all elements in the array field that match the conditions specified in
arrayFilters
.
작업 후 students
컬렉션에는 다음 문서가 포함됩니다.
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 100, 100 ] }
Update All Documents That Match arrayFilters
in an Array
The $[<identifier>]
operator facilitates updates to arrays
that contain embedded documents. To access the fields in the embedded
documents, use the 점 표기법 with the
$[<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 } ] } ] )
To modify the value of the mean
field for all elements in the
grades
array where the grade is greater than or equal to 85
,
use the positional $[<identifier>]
operator and 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 } ] }
Update All Array Elements that Match Multiple Conditions
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 } ] } ] )
To modify the value of the std
field for all elements in the
grades
array where both the grade is greater than or equal to
80
and the std
is greater than or equal to 5
, use the
positional $[<identifier>]
operator and 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 } ] }
Update Array Elements Using a Negation Operator
alumni
컬렉션을 생성합니다.
db.alumni.insertMany( [ { "_id": 1, "name": "Christine Franklin", "degrees": [ { "level": "Master" }, { "level": "Bachelor" } ], }, { "_id": 2, "name": "Reyansh Sengupta", "degrees": [ { "level": "Bachelor" } ], } ] )
To modify all elements in the degrees
array that do not have
"level": "Bachelor"
, use the positional $[<identifier>]
operation with the $ne
query operator:
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' } ] }
$[]
와 함께 중첩 배열 업데이트
The $[<identifier>]
filtered positional operator, in conjunction
with the $[]
all positional operator, can be used to update
nested arrays.
Create a collection students4
with the following document:
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 ] }, ] } )
The following updates the values that are greater than or equal to
8
in the nested grades.questions
array if the associated
grades.type
field is quiz
.
db.students4.updateMany( {}, { $inc: { "grades.$[t].questions.$[score]": 2 } }, { arrayFilters: [ { "t.type": "quiz" }, { "score": { $gte: 8 } } ] } )
참고
Don't add spaces around the array identifiers. If you use
grades.$[ t ].questions.$[ score ]
in the previous example, the
example fails.
After the operation, the collection has the following document:
{ "_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 } } ] } )