소개
이 랩에서는 MongoDB 문서 내에서 배열을 조작하는 방법을 배우게 됩니다. MongoDB 의 강력한 업데이트 연산자를 사용하여 배열 요소를 추가, 제거 및 업데이트하는 연습을 하게 됩니다. 이 랩은 MongoDB 데이터베이스에서 배열 관리를 숙달하는 데 도움이 되는 단계별 지침과 실용적인 예제를 제공합니다.
먼저 $push 연산자를 사용하여 배열에 요소를 추가하는 것으로 시작합니다. 다음으로 $pull 및 $pullAll 연산자를 사용하여 요소를 제거하는 방법을 배우게 됩니다. 또한 배열 내의 특정 요소를 수정하는 방법과 $addToSet을 사용하여 배열에 고유한 요소만 포함되도록 하는 방법을 탐색합니다. 마지막으로 집계 파이프라인을 사용하여 배열에서 기존 중복 항목을 제거하는 방법을 배우게 됩니다.
$push 를 사용하여 배열에 요소 추가
이 단계에서는 $push 연산자를 사용하여 MongoDB 문서의 배열에 새 요소를 추가하는 방법을 배웁니다. 이 연산자는 지정된 값을 배열에 추가합니다.
먼저 MongoDB 셸을 열어 데이터베이스와 상호 작용합니다. 이 랩의 모든 데이터베이스 작업은 이 셸 내에서 수행됩니다.
mongosh
셸에 들어간 후 arraylab 데이터베이스로 전환합니다. 이 데이터베이스는 설정 과정에서 생성되었습니다.
use arraylab
설정 스크립트는 또한 하나의 문서를 가진 students 컬렉션을 생성했습니다. 현재 상태를 확인하기 위해 이 문서를 찾아봅시다.
db.students.findOne({ name: "Alice Johnson" })
다음과 같은 출력을 볼 수 있으며, Alice 가 두 개의 코스에 등록되어 있음을 보여줍니다.
{
_id: ObjectId('...'),
name: 'Alice Johnson',
courses: [ 'Mathematics', 'Computer Science' ]
}
이제 $push 연산자를 사용하여 Alice 의 courses 배열에 "Data Structures"라는 새 코스를 추가해 봅시다.
db.students.updateOne(
{ name: "Alice Johnson" },
{ $push: { courses: "Data Structures" } }
)
updateOne 메서드는 { name: "Alice Johnson" } 필터와 일치하는 문서를 찾고 { $push: { courses: "Data Structures" } } 업데이트를 적용합니다. $push 연산자는 새 코스를 courses 배열에 추가합니다.
$push와 $each 수정자를 결합하여 한 번에 여러 요소를 추가할 수도 있습니다. 배열에 "Physics"와 "Chemistry"를 추가해 봅시다.
db.students.updateOne(
{ name: "Alice Johnson" },
{ $push: { courses: { $each: ["Physics", "Chemistry"] } } }
)
모든 새 코스가 추가되었는지 확인하려면 findOne 명령을 다시 실행합니다.
db.students.findOne({ name: "Alice Johnson" })
업데이트된 문서에는 이제 다섯 개의 코스가 모두 포함되어 있습니다.
{
_id: ObjectId('...'),
name: 'Alice Johnson',
courses: [
'Mathematics',
'Computer Science',
'Data Structures',
'Physics',
'Chemistry'
]
}
배열에서 요소 제거
이 단계에서는 $pull 및 $pullAll 연산자를 사용하여 배열에서 요소를 제거하는 방법을 배웁니다. $pull은 지정된 값의 모든 인스턴스를 제거하는 반면, $pullAll은 여러 지정된 값의 모든 인스턴스를 제거합니다.
이전 단계에서 사용했던 mongosh 셸에 계속 있어야 합니다. 먼저 $pull 연산자를 사용하여 Alice 의 목록에서 "Physics" 코스를 제거해 봅시다.
db.students.updateOne(
{ name: "Alice Johnson" },
{ $pull: { courses: "Physics" } }
)
이 명령은 "Alice Johnson"에 대한 문서를 찾고 그녀의 courses 배열에서 "Physics" 문자열을 제거합니다.
다음으로 여러 코스를 한 번에 제거해 봅시다. $pullAll 연산자가 이를 위해 완벽합니다. "Mathematics"와 "Chemistry"를 제거할 것입니다.
db.students.updateOne(
{ name: "Alice Johnson" },
{ $pullAll: { courses: ["Mathematics", "Chemistry"] } }
)
이제 문서의 최종 상태를 확인하여 어떤 코스가 남아 있는지 살펴봅시다.
db.students.findOne({ name: "Alice Johnson" })
출력은 "Physics", "Mathematics", "Chemistry"가 제거되었고 두 개의 코스만 남았음을 보여줍니다.
{
_id: ObjectId('...'),
name: 'Alice Johnson',
courses: [ 'Computer Science', 'Data Structures' ]
}
배열의 특정 요소 업데이트
이 단계에서는 배열 내의 특정 요소를 수정하는 방법을 배웁니다. 이는 배열에 객체가 포함되어 있고 해당 객체 중 하나의 필드를 업데이트해야 할 때 유용합니다.
먼저 새 학생 문서를 삽입해 봅시다. 이 문서의 courses 배열에는 각각 name과 grade를 가진 객체가 포함됩니다.
db.students.insertOne({
name: "Bob Smith",
courses: [
{ name: "Mathematics", grade: "B" },
{ name: "Computer Science", grade: "A" },
{ name: "Physics", grade: "C" }
]
})
Bob 의 "Computer Science" 과목 등급을 "A"에서 "A+"로 변경한다고 가정해 봅시다. 이때 위치 지정자 $ 연산자를 사용할 수 있습니다. 이 연산자는 쿼리 조건과 일치하는 첫 번째 요소를 위한 자리 표시자 역할을 합니다.
db.students.updateOne(
{ name: "Bob Smith", "courses.name": "Computer Science" },
{ $set: { "courses.$.grade": "A+" } }
)
이 명령에서 쿼리 { "courses.name": "Computer Science" }는 올바른 배열 요소를 식별합니다. 그런 다음 업데이트 { $set: { "courses.$.grade": "A+" } }는 $를 사용하여 해당 요소를 참조하고 grade 필드를 업데이트합니다.
변경 사항을 확인해 봅시다.
db.students.findOne({ name: "Bob Smith" })
출력에는 업데이트된 등급이 표시됩니다.
{
_id: ObjectId('...'),
name: 'Bob Smith',
courses: [
{ name: 'Mathematics', grade: 'B' },
{ name: 'Computer Science', grade: 'A+' },
{ name: 'Physics', grade: 'C' }
]
}
모든 위치 지정자 연산자 $[ ]를 사용하여 배열의 모든 요소를 한 번에 업데이트할 수도 있습니다. Bob 의 모든 과목에 semester 필드를 추가해 봅시다.
db.students.updateOne(
{ name: "Bob Smith" },
{ $set: { "courses.$[].semester": "Fall 2023" } }
)
결과를 확인하기 위해 최종 문서를 확인합니다.
db.students.findOne({ name: "Bob Smith" })
이제 배열의 모든 과목 객체에 semester 필드가 있습니다.
{
_id: ObjectId('...'),
name: 'Bob Smith',
courses: [
{ name: 'Mathematics', grade: 'B', semester: 'Fall 2023' },
{ name: 'Computer Science', grade: 'A+', semester: 'Fall 2023' },
{ name: 'Physics', grade: 'C', semester: 'Fall 2023' }
]
}
$addToSet 를 사용한 고유 요소 보장
이 단계에서는 $addToSet 연산자를 사용하는 방법을 배웁니다. 이 연산자는 배열에 이미 존재하지 않는 요소만 배열에 추가하여 중복 항목을 방지합니다.
먼저 기술 (skills) 배열을 가진 새 학생을 추가해 봅시다.
db.students.insertOne({
name: "Emma Wilson",
skills: ["Python", "JavaScript"]
})
이제 $addToSet을 사용하여 "Python"을 다시 추가해 보겠습니다. "Python"은 이미 배열에 있으므로 이 작업은 문서를 변경하지 않습니다.
db.students.updateOne(
{ name: "Emma Wilson" },
{ $addToSet: { skills: "Python" } }
)
문서를 확인하여 확인해 봅시다.
db.students.findOne({ name: "Emma Wilson" })
"Python"이 이미 존재했기 때문에 skills 배열이 변경되지 않았음을 알 수 있습니다.
{
_id: ObjectId('...'),
name: 'Emma Wilson',
skills: [ 'Python', 'JavaScript' ]
}
$push와 마찬가지로 $addToSet은 $each 수정자와 결합하여 여러 값을 추가할 수 있습니다. 배열에 아직 없는 값만 추가합니다.
db.students.updateOne(
{ name: "Emma Wilson" },
{ $addToSet: {
skills: {
$each: ["React", "Node.js", "Python", "TypeScript"]
}
} }
)
최종 문서를 확인해 봅시다.
db.students.findOne({ name: "Emma Wilson" })
새롭고 고유한 기술이 추가되었으며, 중복된 "Python"은 무시되었습니다.
{
_id: ObjectId('...'),
name: 'Emma Wilson',
skills: [ 'Python', 'JavaScript', 'React', 'Node.js', 'TypeScript' ]
}
배열에서 기존 중복 항목 제거
$addToSet은 새로운 중복 항목을 추가하는 것을 방지하지만, 때로는 배열에 이미 중복 값이 포함된 문서를 가지고 있을 수 있습니다. 이 단계에서는 집계 파이프라인을 사용하여 기존 중복을 제거하는 방법을 배웁니다.
먼저, 중복이 포함된 skills 배열을 가진 문서를 삽입해 보겠습니다.
db.students.insertOne({
name: "Michael Chen",
skills: ["Python", "JavaScript", "Python", "React", "JavaScript", "Node.js"]
})
이러한 중복을 제거하기 위해 $merge 단계를 포함하는 집계 파이프라인을 사용할 수 있습니다. 이 파이프라인은 문서를 읽고, 고유한 요소로 구성된 새 배열을 생성한 다음, 원본 문서를 업데이트합니다.
먼저, $merge 작업이 올바르게 작동하도록 name 필드에 인덱스를 생성해야 합니다.
db.students.createIndex({ name: 1 }, { unique: true })
이제 다음 집계 명령을 실행합니다.
db.students.aggregate([
{ $match: { name: "Michael Chen" } },
{ $project: {
name: 1,
skills: { $setUnion: "$skills" }
} },
{ $merge: { into: "students", on: "name", whenMatched: "replace" } }
])
이 파이프라인을 자세히 살펴보겠습니다.
$match: 이 단계는 문서를 필터링하여 "Michael Chen"에 대한 문서만 처리합니다.$project: 이 단계는 문서를 재구성합니다.name필드를 유지하고skills배열을$setUnion: "$skills"의 결과로 바꿉니다.$setUnion연산자는 배열을 입력으로 받아 고유한 요소만 포함하는 새 배열을 반환합니다.$merge: 이 단계는 파이프라인의 결과를students컬렉션에 다시 씁니다.name필드 (on: "name") 를 기준으로 업데이트할 문서를 찾고 파이프라인의 새 문서로 전체 문서를 바꿉니다 (whenMatched: "replace"). 생성한 인덱스는 효율적인 일치 및 업데이트를 보장합니다.
이제 중복이 제거되었는지 확인해 보겠습니다.
db.students.findOne({ name: "Michael Chen" })
출력에는 고유한 요소만 포함된 skills 배열이 표시됩니다. 요소의 순서는 다를 수 있습니다.
{
_id: ObjectId('...'),
name: 'Michael Chen',
skills: [ 'JavaScript', 'Node.js', 'Python', 'React' ]
}
요약
이 실습에서는 MongoDB 에서 배열을 관리하는 몇 가지 필수 기술을 배웠습니다. $push로 요소를 추가하고, $pull 및 $pullAll로 요소를 제거하고, 위치 지정자 $ 연산자를 사용하여 특정 요소를 업데이트하는 방법을 실습했습니다. 또한 $addToSet을 사용하여 배열의 고유 요소를 유지하는 방법과 $setUnion 및 $merge를 포함하는 집계 파이프라인을 사용하여 기존 중복을 정리하는 방법을 살펴보았습니다. 이러한 기술은 MongoDB 를 사용하여 동적이고 강력한 애플리케이션을 구축하는 데 기본이 됩니다.

