문서 메뉴

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

$ []

이 페이지의 내용

  • 정의
  • 행동
  • 예제
$[]

전체 위치 연산자 $[] 은(는) 업데이트 연산자가 지정된 배열 필드의 모든 요소를 수정해야 함을 나타냅니다.

$[] 연산자의 형식은 다음과 같습니다.

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

다음도 참조하세요.

← $ (업데이트)

이 페이지의 내용