MongoDB 배열 처리

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 MongoDB 배열을 다루는 방법을 배우게 됩니다. 배열은 MongoDB 의 기본적인 데이터 구조로, 단일 문서 내에 값 목록을 저장할 수 있게 해줍니다. 배열 필드가 있는 문서 생성, 요소 추가 및 제거, 배열 내 값 업데이트, 배열 내용을 기반으로 한 쿼리 수행 등 다양한 작업을 탐색하게 됩니다. 이러한 기술은 MongoDB 에서 복잡한 데이터 구조를 효과적으로 관리하는 데 필수적입니다.

이 랩이 끝나면 MongoDB 배열을 다루는 방법에 대한 견고하고 실용적인 이해를 갖추게 되어, 더욱 정교하고 유연한 데이터베이스 스키마를 구축할 수 있게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

배열 필드가 있는 문서 생성

첫 번째 단계에서는 MongoDB 서버에 연결하고 배열 필드를 포함하는 새 문서를 생성합니다. 배열은 태그, 댓글 또는 강좌와 같이 여러 관련 값을 문서 내에 직접 저장할 수 있게 해주므로 강력합니다.

먼저 MongoDB 셸을 열어 데이터베이스와 상호 작용을 시작합니다. 이 랩의 모든 후속 작업은 mongosh 셸 내에서 수행합니다.

mongosh

셸에 들어가면 test>와 같은 프롬프트가 표시됩니다. 이 랩을 위해 사전 구성된 arraylab 데이터베이스로 전환하겠습니다.

use arraylab

setup 스크립트가 이미 students 컬렉션을 생성하고 문서를 하나 삽입했습니다. 이제 "Alice Johnson"이라는 학생의 새 문서를 삽입합니다. 이 문서에는 문자열 배열인 courses 필드가 포함됩니다.

db.students.insertOne({
    name: "Alice Johnson",
    age: 22,
    courses: ["Mathematics", "Computer Science", "Physics"]
})

이 명령은 students 컬렉션에 단일 문서를 삽입합니다. courses 필드는 세 개의 문자열 요소를 포함하는 배열을 보유합니다.

문서가 성공적으로 생성되었는지 확인하려면 find() 메서드를 사용하여 컬렉션의 모든 문서를 검색할 수 있습니다. .pretty() 메서드는 출력을 더 읽기 쉽게 형식화합니다.

db.students.find().pretty()

설정 중에 생성된 "Bob Smith" 문서와 방금 추가한 "Alice Johnson" 문서, 총 두 개의 문서를 볼 수 있습니다.

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 95, 87, 92 ],
    activities: [ 'Chess Club', 'Debate Team' ]
  },
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    age: 22,
    courses: [ 'Mathematics', 'Computer Science', 'Physics' ]
  }
]

배열에 요소 추가

배열을 생성한 후에는 일반적으로 새 요소를 추가하는 작업이 수행됩니다. 이 단계에서는 $push 연산자를 사용하여 기존 배열에 요소를 추가하는 방법을 배웁니다.

배열에 단일 요소를 추가하려면 업데이트 작업에서 $push 연산자를 사용합니다. Alice Johnson 의 강좌 목록에 새 강좌인 "Data Science"를 추가해 보겠습니다.

db.students.updateOne(
    { name: "Alice Johnson" },
    { $push: { courses: "Data Science" } }
)

이 명령에서 첫 번째 인수 { name: "Alice Johnson" }는 업데이트할 문서를 찾는 필터입니다. 두 번째 인수 { $push: { courses: "Data Science" } }는 업데이트 작업을 지정합니다. $push는 "Data Science" 값을 courses 배열에 추가합니다.

Alice 의 문서를 다시 찾아 변경 사항을 확인해 보겠습니다.

db.students.find({ name: "Alice Johnson" }).pretty()

출력에는 배열에 추가된 새 강좌가 표시됩니다.

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    age: 22,
    courses: [ 'Mathematics', 'Computer Science', 'Physics', 'Data Science' ]
  }
]

한 번에 여러 요소를 추가하려면 $push$each 수정자를 결합할 수 있습니다. Bob Smith 에 대한 두 가지 새 활동을 추가해 보겠습니다.

db.students.updateOne(
    { name: "Bob Smith" },
    { $push: { activities: { $each: ["Robotics Club", "Swimming Team"] } } }
)

여기서 $each$push에게 제공된 목록 (["Robotics Club", "Swimming Team"]) 의 각 항목을 activities 배열에 추가하도록 지시합니다.

이 업데이트도 확인해 보겠습니다.

db.students.find({ name: "Bob Smith" }).pretty()

출력은 두 개의 새 활동이 모두 추가되었음을 확인합니다.

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 95, 87, 92 ],
    activities: [ 'Chess Club', 'Debate Team', 'Robotics Club', 'Swimming Team' ]
  }
]

배열에서 요소 제거

요소를 추가할 수 있는 것처럼 제거할 수도 있어야 합니다. MongoDB 는 이 목적을 위해 여러 연산자를 제공합니다. 이 단계에서는 $pull을 사용하여 값으로 요소를 제거하고 $pop을 사용하여 위치로 요소를 제거하는 방법을 배웁니다.

값에 따라 배열에서 특정 요소를 제거하려면 $pull 연산자를 사용합니다. Alice 의 강좌 목록에서 "Physics"를 제거해 보겠습니다.

db.students.updateOne(
    { name: "Alice Johnson" },
    { $pull: { courses: "Physics" } }
)

이 명령은 Alice 의 문서를 찾아 그녀의 courses 배열에서 "Physics"의 모든 발생을 제거합니다. 결과를 확인해 보세요.

db.students.find({ name: "Alice Johnson" }).pretty()

출력에는 "Physics"가 더 이상 배열에 없음을 보여줍니다.

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    age: 22,
    courses: [ 'Mathematics', 'Computer Science', 'Data Science' ]
  }
]

목록의 값과 일치하는 여러 요소를 제거하려면 $pullAll 연산자를 사용할 수 있습니다. Bob 의 활동에서 "Chess Club"과 "Debate Team"을 모두 제거해 보겠습니다.

db.students.updateOne(
    { name: "Bob Smith" },
    { $pullAll: { activities: ["Chess Club", "Debate Team"] } }
)

Bob 의 문서에 대한 업데이트를 확인해 보세요.

db.students.find({ name: "Bob Smith" }).pretty()

출력은 지정된 활동이 제거되었음을 확인합니다.

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 95, 87, 92 ],
    activities: [ 'Robotics Club', 'Swimming Team' ]
  }
]

배열의 시작 또는 끝에서 요소를 제거해야 하는 경우 $pop 연산자를 사용할 수 있습니다. 마지막 요소를 제거하려면 1을 사용하고 첫 번째 요소를 제거하려면 -1을 사용합니다. Alice 의 목록에서 마지막 강좌를 제거해 보겠습니다.

db.students.updateOne(
    { name: "Alice Johnson" },
    { $pop: { courses: 1 } }
)

Alice 의 강좌의 최종 상태를 보겠습니다.

db.students.find({ name: "Alice Johnson" }).pretty()

출력에는 마지막 요소인 "Data Science"가 제거되었음을 보여줍니다.

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    age: 22,
    courses: [ 'Mathematics', 'Computer Science' ]
  }
]

배열 요소 업데이트

배열 내의 기존 요소를 업데이트하는 것은 또 다른 중요한 작업입니다. 이 단계에서는 위치 지정 연산자 (positional operators) 를 사용하여 배열 요소를 업데이트하는 방법을 다룹니다.

배열에서 특정 요소를 하나 업데이트하려면 먼저 문서를 찾고 변경하려는 요소를 식별해야 합니다. 그런 다음 위치 지정 $ 연산자를 사용하여 업데이트를 수행할 수 있습니다. Alice 의 courses 배열에서 "Mathematics"를 "Advanced Mathematics"로 변경해 보겠습니다.

db.students.updateOne(
    { name: "Alice Johnson", courses: "Mathematics" },
    { $set: { "courses.$": "Advanced Mathematics" } }
)

이 명령에서 필터 { name: "Alice Johnson", courses: "Mathematics" }는 문서를 찾고 배열에서 "Mathematics"의 첫 번째 발생 위치를 식별합니다. 업데이트 { $set: { "courses.$": "Advanced Mathematics" } }courses.$를 사용하여 해당 일치 요소의 위치를 참조하고 새 값을 설정합니다.

변경 사항을 확인해 보세요.

db.students.find({ name: "Alice Johnson" }).pretty()

출력에는 업데이트된 강좌 이름이 표시됩니다.

[
  {
    _id: ObjectId("..."),
    name: 'Alice Johnson',
    age: 22,
    courses: [ 'Advanced Mathematics', 'Computer Science' ]
  }
]

조건과 일치하는 배열의 모든 요소를 업데이트하려면 모든 위치 지정 $[ ] 연산자를 사용할 수 있습니다. $inc (증가) 연산자를 사용하여 Bob 의 모든 성적을 5 점씩 올려보겠습니다.

db.students.updateOne(
    { name: "Bob Smith" },
    { $inc: { "grades.$[]": 5 } }
)

여기서 grades.$[]grades 배열의 모든 요소에 $inc 연산을 적용합니다.

Bob 의 새 성적을 확인해 보세요.

db.students.find({ name: "Bob Smith" }).pretty()

출력에는 각 성적이 5 점씩 증가했음을 보여줍니다.

[
  {
    _id: ObjectId("..."),
    name: 'Bob Smith',
    grades: [ 100, 92, 97 ],
    activities: [ 'Robotics Club', 'Swimming Team' ]
  }
]

배열 내용을 기반으로 문서 쿼리

쿼리는 모든 데이터베이스의 핵심입니다. MongoDB 는 배열 내용에 기반하여 문서를 쿼리하기 위한 풍부한 연산자 세트를 제공합니다. 이 마지막 단계에서는 배열 요소 및 해당 속성을 일치시켜 문서를 찾는 방법을 배웁니다.

배열에 특정 요소가 포함된 모든 문서를 찾으려면 쿼리 필터에 해당 값을 포함할 수 있습니다. "Computer Science"에 등록된 모든 학생을 찾아보겠습니다.

db.students.find({ courses: "Computer Science" }).pretty()

이 쿼리는 Alice 의 courses 배열에 "Computer Science"가 포함되어 있으므로 Alice 의 문서를 반환합니다.

배열에 지정된 요소 집합의 모두가 포함된 문서를 찾으려면 $all 연산자를 사용합니다.

db.students.find({
    courses: { $all: ["Advanced Mathematics", "Computer Science"] }
}).pretty()

이것 역시 Alice 의 courses 배열에 이 두 값이 모두 포함되어 있으므로 Alice 의 문서를 반환합니다.

배열 요소에 대한 더 복잡한 조건의 경우 $elemMatch 연산자가 매우 유용합니다. 이를 통해 단일 배열 요소가 충족해야 하는 여러 기준을 지정할 수 있습니다. 95 점보다 높은 성적이 하나 이상 있는 학생을 찾아보겠습니다.

db.students.find({
    grades: { $elemMatch: { $gt: 95 } }
}).pretty()

이 쿼리는 이제 95 점 이상인 성적이 있는 Bob 의 문서를 반환합니다. $gt는 "greater than"(보다 큼) 을 의미합니다.

$size 연산자를 사용하여 배열의 요소 수를 기반으로 쿼리할 수도 있습니다. 정확히 두 개의 활동에 참여하는 학생을 찾아보겠습니다.

db.students.find({
    activities: { $size: 2 }
}).pretty()

이것은 Bob 의 activities 배열에 현재 두 개의 요소가 있으므로 Bob 의 문서를 반환합니다.

마지막으로, 추가 연습을 위해 학생 한 명을 더 추가해 보겠습니다.

db.students.insertOne({
    name: "Charlie Brown",
    courses: ["Art", "Music", "Literature"],
    grades: [88, 92, 85],
    activities: ["Painting Club"]
})

이제 "Art" 또는 "Music"을 수강하고 ( $in 연산자 사용) 90 점 이상인 성적이 하나 이상 있는 ( $gte와 함께 $elemMatch 사용) 학생을 찾습니다.

db.students.find({
    courses: { $in: ["Art", "Music"] },
    grades: { $elemMatch: { $gte: 90 } }
}).pretty()

이 쿼리는 두 조건을 모두 충족하는 "Charlie Brown"의 문서를 반환합니다.

요약

이 실습에서는 MongoDB 에서 배열을 처리하는 기본적인 기술을 배웠습니다. 배열 필드가 있는 문서를 생성하는 것으로 시작하여 $push$each를 사용하여 요소를 추가하는 연습을 했습니다. $pull$pullAll을 사용하여 값으로 요소를 제거하고, $pop을 사용하여 위치로 요소를 제거하는 방법을 탐색했습니다. 또한 위치 지정 $ 연산자를 사용하여 특정 배열 요소를 업데이트하고 $[ ] 연산자를 사용하여 모든 요소를 업데이트하는 방법을 배웠습니다. 마지막으로 $all, $elemMatch, $size, $in과 같은 연산자를 사용하여 배열 내용을 기반으로 문서를 쿼리하는 연습을 했습니다. 이러한 기술은 MongoDB 에서 복잡한 중첩 데이터 구조를 가진 애플리케이션을 구축하고 관리하는 데 매우 중요합니다.