문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

$[<identifier>]

이 페이지의 내용

  • 정의
  • 행동
  • 제한 사항
  • upsert
  • 중첩 배열
  • 예제
  • 일치하는 모든 배열 요소 업데이트 arrayFilters
  • 배열에서 arrayFilters와(과) 일치하는 모든 문서 업데이트
  • 여러 조건과 일치하는 모든 배열 요소 업데이트하기
  • 부정 연산자를 사용하여 배열 요소 업데이트하기
  • 다음과 함께 중첩 배열을 업데이트합니다. $[]
$[<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 옵션에는 다음 쿼리 연산자를 포함할 수 없습니다.

작업으로 인해 삽입이 발생하는 경우 업데이트 문에서 $[<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>]는 둘 이상의 배열과 중첩 배열을 트래버스하는 쿼리에 사용할 수 있습니다.

예제 $[] 와 함께 중첩 배열 업데이트를 참조하세요.

students 컬렉션을 생성합니다.

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 95, 92, 90 ] },
{ "_id" : 2, "grades" : [ 98, 100, 102 ] },
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
] )

배열에서 보다 크거나 같은 모든 요소를 100 grades 업데이트하려면 필터링된 위치 연산자 를 와 함께 사용합니다.$[<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 ] }

$[<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 이상이고 std5 이상인 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" 수정하려면 쿼리 연산자와 $[<identifier>] $ne 함께 위치 연산을 사용합니다.

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 } } ] }
)

다음도 참조하세요.

← $ []