소개
이 랩에서는 다양한 쿼리 기법을 사용하여 MongoDB 컬렉션을 효과적으로 필터링하는 방법을 배우게 됩니다. 이 랩에서는 여러 조건 적용, 비교 연산자 사용, 정규 표현식으로 일치시키기, 필드 존재 여부 확인, null 값 찾기 등을 다룹니다. 이러한 기술은 MongoDB 에서 정확한 데이터 검색에 필수적입니다. 단계별 지침은 MongoDB 쿼리 기본 사항을 숙달하는 데 도움이 되는 실용적인 예제를 제공합니다.
여러 조건 적용
이 단계에서는 MongoDB 컬렉션에서 문서를 필터링하기 위해 여러 조건을 적용하는 방법을 배우게 됩니다. 이를 통해 여러 기준을 결합하여 더 정확한 쿼리를 수행할 수 있습니다.
먼저 터미널을 열고 MongoDB Shell 을 시작합니다. 이 대화형 쉘에서 모든 데이터베이스 명령을 실행하게 됩니다.
mongosh
mongosh 쉘에 들어가면 > 프롬프트가 표시됩니다. school_database라는 새 데이터베이스로 전환하고 샘플 데이터가 포함된 students 컬렉션을 만들어 보겠습니다.
use school_database
db.students.insertMany([
{ name: "Alice", age: 22, grade: "A", major: "Computer Science" },
{ name: "Bob", age: 20, grade: "B", major: "Mathematics" },
{ name: "Charlie", age: 25, grade: "A", major: "Physics" },
{ name: "David", age: 19, grade: "C", major: "Computer Science" }
]);
이 명령은 students 컬렉션에 네 개의 문서를 삽입합니다. 이제 여러 조건을 충족하는 학생을 찾아보겠습니다. $and 연산자를 사용하여 나이가 20 세 이상이고 AND 성적이 "A"인 학생을 찾습니다.
db.students.find({
$and: [{ age: { $gte: 20 } }, { grade: "A" }]
});
이 쿼리는 "크거나 같음"을 의미하는 $gte와 두 조건이 모두 충족되도록 하는 $and를 사용합니다. 출력에는 Alice 와 Charlie 가 표시됩니다.
[
{
_id: ObjectId("..."),
name: 'Alice',
age: 22,
grade: 'A',
major: 'Computer Science'
},
{
_id: ObjectId("..."),
name: 'Charlie',
age: 25,
grade: 'A',
major: 'Physics'
}
]
다음으로 $or 연산자를 사용하여 여러 조건 중 하나 이상과 일치하는 문서를 찾습니다. 이 쿼리는 전공이 "Computer Science"이거나 OR 나이가 21 세 미만인 학생을 찾습니다.
db.students.find({
$or: [{ major: "Computer Science" }, { age: { $lt: 21 } }]
});
이 쿼리는 "미만"을 의미하는 $lt를 사용합니다. 결과에는 Alice 와 David (Computer Science 전공) 및 Bob 과 David (21 세 미만) 가 포함됩니다. David 는 두 조건 모두 일치하므로 한 번만 나타납니다.
[
{
_id: ObjectId("..."),
name: 'Alice',
age: 22,
grade: 'A',
major: 'Computer Science'
},
{
_id: ObjectId("..."),
name: 'Bob',
age: 20,
grade: 'B',
major: 'Mathematics'
},
{
_id: ObjectId("..."),
name: 'David',
age: 19,
grade: 'C',
major: 'Computer Science'
}
]
다음 단계에서는 더 많은 비교 연산자를 살펴보겠습니다. 지금은 mongosh 쉘에 그대로 계셔도 됩니다.
비교 연산자 사용
이 단계에서는 MongoDB 의 비교 연산자를 사용하여 더 정교한 쿼리를 구축하게 됩니다. 이러한 연산자를 사용하면 값 비교를 기반으로 데이터를 필터링할 수 있습니다.
이전 단계에서 사용했던 mongosh 쉘에 그대로 있어야 합니다. 먼저 기존 컬렉션을 삭제하고 작업할 credits 필드가 있는 새 데이터를 삽입해 보겠습니다.
db.students.drop();
db.students.insertMany([
{
name: "Alice",
age: 22,
grade: "A",
major: "Computer Science",
credits: 45
},
{ name: "Bob", age: 20, grade: "B", major: "Mathematics", credits: 35 },
{ name: "Charlie", age: 25, grade: "A", major: "Physics", credits: 50 },
{ name: "David", age: 19, grade: "C", major: "Computer Science", credits: 25 }
]);
이제 "보다 큼" ($gt) 및 "보다 작음" ($lt) 연산자를 사용하여 20 세보다 많고 25 세보다 적은 학생을 찾아보겠습니다.
db.students.find({ age: { $gt: 20, $lt: 25 } });
이 쿼리는 22 세인 Alice 의 문서만 반환합니다.
다음으로 "크거나 같음" ($gte) 및 "작거나 같음" ($lte) 을 사용하여 40 에서 50 사이의 학점을 가진 학생을 찾습니다 (포함).
db.students.find({ credits: { $gte: 40, $lte: 50 } });
이 쿼리는 Alice (45 학점) 와 Charlie (50 학점) 를 반환합니다.
마지막으로 "같지 않음" ($ne) 연산자를 사용하여 성적이 "C"가 아닌 모든 학생을 찾아보겠습니다.
db.students.find({ grade: { $ne: "C" } });
이 쿼리는 "C" 등급을 가진 David 를 제외하고 Alice, Bob, Charlie 를 반환합니다. 이러한 연산자는 MongoDB 에서 상세하고 구체적인 쿼리를 만드는 데 기본적입니다.
정규 표현식으로 일치시키기
정규 표현식 (regex) 은 강력한 텍스트 검색을 수행하는 유연한 방법을 제공합니다. 이 단계에서는 MongoDB 쿼리에서 정규 표현식을 사용하는 방법을 배우게 됩니다.
먼저 이 단계를 위한 데이터를 준비해 보겠습니다. 컬렉션을 삭제하고 더 상세한 문자열 필드가 있는 새 문서를 삽입합니다.
db.students.drop();
db.students.insertMany([
{
name: "Alice Johnson",
age: 22,
major: "Computer Science",
email: "alice.j@example.com"
},
{
name: "Bob Smith",
age: 20,
major: "Mathematics",
email: "bob.smith@university.edu"
},
{
name: "Charlie Brown",
age: 25,
major: "Physics",
email: "charlie.brown@school.org"
},
{
name: "David Lee",
age: 19,
major: "Computer Engineering",
email: "david.lee@tech.net"
}
]);
이름이 "Alice"로 시작하는 모든 학생을 찾으려면 앵커 ^와 함께 $regex 연산자를 사용할 수 있습니다.
db.students.find({ name: { $regex: "^Alice" } });
이 쿼리는 "Alice Johnson"의 문서를 반환합니다. ^ 문자는 문자열의 시작을 나타냅니다.
example.com과 같은 특정 도메인의 이메일 주소를 가진 학생을 찾으려면 문자열 끝을 일치시키기 위해 $ 앵커를 사용합니다.
db.students.find({ email: { $regex: "@example.com$" } });
이 쿼리는 @example.com으로 끝나는 Alice Johnson 을 찾습니다.
대소문자를 구분하지 않는 검색도 수행할 수 있습니다. 다음 쿼리는 i 옵션을 사용하여 이름에 "smith"가 포함된 학생을 대소문자 구분 없이 찾습니다.
db.students.find({ name: { $regex: "smith", $options: "i" } });
이 쿼리는 "Bob Smith"와 일치합니다.
마지막으로 "Computer"라는 단어를 포함하는 모든 전공을 찾으려면 앵커 없이 간단한 정규 표현식 패턴을 사용할 수 있습니다.
db.students.find({ major: { $regex: "Computer" } });
이 쿼리는 "Alice Johnson" (Computer Science) 과 "David Lee" (Computer Engineering) 모두를 반환합니다.
필드 존재 여부 확인
때로는 컬렉션의 문서들이 서로 다른 구조를 가질 수 있습니다. 이 단계에서는 특정 필드가 있는지 없는지에 따라 문서를 쿼리하는 방법을 배웁니다.
먼저 일부 필드가 누락된 새 문서 세트를 삽입하여 시작하겠습니다.
db.students.drop();
db.students.insertMany([
{ name: "Alice", age: 22, major: "Computer Science", scholarship: 1000 },
{ name: "Bob", age: 20, major: "Mathematics" },
{ name: "Charlie", age: 25, major: "Physics", internship: "Research Lab" },
{ name: "David", age: 19, contact: { phone: "555-1234" } }
]);
scholarship 필드를 가진 모든 학생을 찾으려면 $exists 연산자에 true 값을 사용합니다.
db.students.find({ scholarship: { $exists: true } });
이 쿼리는 Alice 만 scholarship 필드를 가지고 있으므로 Alice 의 문서만 반환합니다.
반대로 internship 필드가 없는 학생을 찾으려면 $exists를 false로 설정합니다.
db.students.find({ internship: { $exists: false } });
이 쿼리는 Alice, Bob, David 의 문서를 반환합니다. 이들 중 누구도 internship 필드를 가지고 있지 않기 때문입니다.
$exists 연산자는 중첩된 필드에서도 작동합니다. phone 필드를 포함하는 contact 객체를 가진 학생을 찾으려면 점 표기법 (dot notation) 을 사용할 수 있습니다.
db.students.find({ "contact.phone": { $exists: true } });
이 쿼리는 contact 객체 내의 phone 필드를 구체적으로 찾으며 David 의 문서를 반환합니다.
Null 값 찾기
이 마지막 단계에서는 null 값을 포함하는 문서를 쿼리하는 방법을 배웁니다. null 값은 값의 의도적인 부재를 나타냅니다.
먼저 null 값과 누락된 필드를 포함하는 문서를 가진 컬렉션을 설정해 보겠습니다.
db.students.drop();
db.students.insertMany([
{ name: "Alice", age: 22, email: null },
{ name: "Bob", age: 20, major: "Mathematics" },
{ name: "Charlie", age: null, major: "Physics" },
{ name: "David", contact: { email: null } }
]);
필드에 null 값이 있는 문서를 찾으려면 null을 직접 쿼리할 수 있습니다. 다음 쿼리는 email 필드가 null이거나 email 필드가 존재하지 않는 모든 문서를 찾습니다.
db.students.find({ email: null });
이 쿼리는 Alice( email이 명시적으로 null인 경우), Bob( email 필드가 누락된 경우), Charlie( email 필드가 누락된 경우) 및 David( email 필드가 누락된 경우) 의 네 가지 문서를 모두 반환합니다.
필드가 명시적으로 null로 설정된 문서만 찾으려면 null 검사를 $exists 검사와 결합해야 합니다.
db.students.find({ email: { $type: "null" } });
또는 $type 연산자를 사용할 수 있습니다. null의 BSON 유형은 10 입니다. 이 쿼리는 Alice 의 문서만 반환합니다.
db.students.find({ email: { $type: 10 } });
중첩된 문서 내의 null 값도 쿼리할 수 있습니다. 다음 쿼리는 contact 객체 내의 email 필드가 null이거나 contact 필드가 존재하지 않는 문서를 찾습니다.
db.students.find({ "contact.email": null });
이 쿼리는 Alice, Bob 및 Charlie( contact 필드가 누락된 경우) 와 David( contact.email이 명시적으로 null인 경우) 의 네 가지 문서를 모두 반환합니다. null을 쿼리하는 방법을 이해하는 것은 불완전하거나 희소한 데이터를 처리하는 데 중요합니다.
완료되면 exit를 입력하거나 Ctrl+D를 눌러 mongosh 셸을 종료할 수 있습니다.
요약
이 실습에서는 MongoDB 에서 컬렉션을 필터링하는 몇 가지 필수 기술을 배웠습니다. 복잡하고 정확한 쿼리를 생성할 수 있는 $and 및 $or 연산자를 사용하여 여러 조건을 적용하는 연습을 했습니다. 또한 $gt, $lt, $ne와 같은 다양한 비교 연산자를 탐색하여 검색 기준을 구체화했습니다. 또한 정규 표현식을 사용하여 텍스트를 일치시키고, $exists를 사용하여 필드 존재 여부를 확인하고, null 값을 쿼리하는 경험을 쌓았습니다. 이러한 기술은 MongoDB 에서 효과적인 데이터 검색 및 조작을 위한 강력한 기반을 제공합니다.

