기본 MongoDB 쿼리 작성

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 필수적인 MongoDB 쿼리 기법을 배우게 됩니다. 데이터베이스에 연결하고 데이터를 삽입하는 것부터 시작합니다. 그런 다음 문서를 검색하고, 정확히 일치하는 항목 및 비교 연산자를 사용하여 필터링하고, 반환할 특정 필드를 선택하고, 결과를 정렬하고 제한하여 출력을 형식화하는 연습을 합니다. 이 랩이 끝나면 MongoDB 데이터베이스에서 데이터를 쿼리하는 데 탄탄한 기반을 갖추게 될 것입니다.

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

MongoDB 에 연결하고 모든 문서 찾기

이 첫 번째 단계에서는 MongoDB 서버에 연결하고, 데이터베이스와 컬렉션을 생성하고, 샘플 데이터를 삽입한 다음, 해당 컬렉션에서 모든 문서를 검색합니다. 이것은 모든 데이터베이스 상호 작용의 시작점입니다.

먼저 터미널을 열고 mongosh 명령을 실행하여 MongoDB Shell 을 시작합니다.

mongosh

이제 MongoDB Shell 내부에 있으며 데이터베이스 명령을 실행할 준비가 되었음을 나타내도록 터미널 프롬프트가 변경됩니다.

다음으로 bookstore라는 새 데이터베이스로 전환합니다. 데이터베이스가 존재하지 않으면 MongoDB 는 데이터를 처음 저장할 때 이를 생성합니다.

use bookstore

이제 books라는 새 컬렉션에 일부 문서를 삽입해 보겠습니다. 컬렉션은 관계형 데이터베이스의 테이블과 유사한 MongoDB 문서 그룹입니다. insertMany() 메서드를 사용하면 여러 문서를 한 번에 추가할 수 있습니다.

db.books.insertMany([
  { title: "Python Basics", author: "John Smith", year: 2022, stock: 15 },
  { title: "MongoDB Essentials", author: "Jane Doe", year: 2023, stock: 8 },
  { title: "Web Development", author: "Alice Johnson", year: 2021, stock: 20 }
]);

명령을 실행한 후 문서가 성공적으로 삽입되었다는 확인 메시지가 표시됩니다.

books 컬렉션의 모든 문서를 검색하고 보려면 인수가 없는 find() 메서드를 사용합니다.

db.books.find();

출력에는 방금 삽입한 세 개의 문서가 모두 나열됩니다. 각 문서에는 MongoDB 에서 자동으로 추가되는 고유 식별자인 _id 필드가 있습니다.

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  },
  {
    _id: ObjectId("..."),
    title: 'MongoDB Essentials',
    author: 'Jane Doe',
    year: 2023,
    stock: 8
  },
  {
    _id: ObjectId("..."),
    title: 'Web Development',
    author: 'Alice Johnson',
    year: 2021,
    stock: 20
  }
]

정확히 일치하는 문서 쿼리

이제 모든 문서를 검색할 수 있으므로 다음 단계는 특정 문서를 찾기 위해 필터링하는 것입니다. find() 메서드에 쿼리 필터 문서를 제공하여 이를 수행할 수 있습니다. 이를 통해 필드 값에 대한 정확한 일치를 수행할 수 있습니다.

"Python Basics"라는 정확한 제목의 책을 찾아봅시다. 쿼리 필터 { title: "Python Basics" }title 필드가 정확히 "Python Basics"인 문서만 반환하도록 MongoDB 에 지시합니다.

db.books.find({ title: "Python Basics" });

이 명령은 기준과 일치하는 문서 하나만 반환합니다.

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  }
]

숫자와 같은 다른 필드를 기반으로 쿼리할 수도 있습니다. 예를 들어 2021 년에 출판된 모든 책을 찾으려면 다음과 같이 합니다.

db.books.find({ year: 2021 });

더 구체적인 쿼리를 만들려면 필터 문서에 여러 필드를 지정할 수 있습니다. 이렇게 하면 암시적인 "AND" 조건이 생성됩니다. 즉, 문서가 반환되려면 지정된 모든 조건이 참이어야 합니다. "Jane Doe"가 작성하고 2023 년에 출판된 책을 찾아봅시다.

db.books.find({ author: "Jane Doe", year: 2023 });

이 쿼리는 "MongoDB Essentials" 책을 반환합니다. 해당 책은 저자와 연도 모두와 일치하는 유일한 책이기 때문입니다.

비교 연산자를 사용한 필터링

정확한 일치는 유용하지만, 특정 연도 이후에 출판된 모든 책이나 특정 수준 이상의 재고를 가진 책을 찾는 것과 같이 비교를 기반으로 문서를 찾아야 하는 경우가 많습니다. MongoDB 는 이러한 목적을 위해 일련의 쿼리 연산자를 제공합니다.

비교 연산자는 { field: { $operator: value } }와 같은 구문을 사용하여 쿼리 문서 내에서 지정됩니다.

2021 년 이후에 출판된 모든 책을 찾아봅시다. "보다 큼" 연산자인 $gt를 사용합니다.

db.books.find({ year: { $gt: 2021 } });

이 명령은 "Python Basics"(2022) 와 "MongoDB Essentials"(2023) 을 반환합니다.

다음은 몇 가지 다른 일반적인 비교 연산자입니다.

  • $lt: 보다 작음
  • $gte: 보다 크거나 같음
  • $lte: 보다 작거나 같음
  • $ne: 같지 않음

예를 들어, 재고가 15 개 이하인 모든 책을 찾으려면 $lte 연산자를 사용할 수 있습니다.

db.books.find({ stock: { $lte: 15 } });

또 다른 유용한 연산자는 배열에 지정된 값 중 하나와 일치하는 $in입니다. "John Smith" 또는 "Alice Johnson"이 작성한 모든 책을 찾아봅시다.

db.books.find({ author: { $in: ["John Smith", "Alice Johnson"] } });

이 쿼리는 "Python Basics"와 "Web Development"를 반환합니다. 연산자를 정확한 일치와 결합하여 더 복잡한 쿼리를 만들 수 있습니다. 예를 들어, 2022 년 이후에 출판되었고 재고가 20 개 미만인 책을 찾아봅시다.

db.books.find({ year: { $gte: 2022 }, stock: { $lt: 20 } });

반환할 특정 필드 선택 (Projection)

기본적으로 MongoDB 쿼리는 일치하는 문서의 모든 필드를 반환합니다. 성능을 개선하고 출력을 더 깔끔하게 만들기 위해 반환할 필드를 지정할 수 있습니다. 이를 프로젝션 (projection) 이라고 합니다.

프로젝션은 find() 메서드의 두 번째 인수로 처리됩니다. 이 인수는 포함할 필드를 1로, 제외할 필드를 0으로 지정하는 문서입니다.

모든 책을 검색하되 titleauthor 필드만 반환해 보겠습니다. 첫 번째 인수 {}는 빈 필터로, 모든 문서를 일치시킵니다.

db.books.find({}, { title: 1, author: 1 });

출력에 _id 필드가 여전히 포함되어 있음을 알 수 있습니다. _id 필드는 기본적으로 항상 반환됩니다. 이를 제외하려면 명시적으로 0으로 설정해야 합니다.

db.books.find({}, { title: 1, author: 1, _id: 0 });

이제 출력은 요청된 필드만 포함하여 훨씬 깔끔해집니다.

[
  { "title": "Python Basics", "author": "John Smith" },
  { "title": "MongoDB Essentials", "author": "Jane Doe" },
  { "title": "Web Development", "author": "Alice Johnson" }
]

쿼리 필터와 프로젝션을 결합할 수 있습니다. 예를 들어 2023 년에 출판된 책을 찾고 해당 제목만 반환해 보겠습니다.

db.books.find({ year: 2023 }, { title: 1, _id: 0 });

이 강력한 기능을 통해 애플리케이션에 필요한 정확한 쿼리 결과를 맞춤 설정하여 불필요한 데이터 전송을 줄일 수 있습니다.

결과 정렬, 건너뛰기 및 제한

종종 쿼리에서 반환되는 결과의 순서와 수량을 제어해야 합니다. MongoDB 는 결과 세트에서 문서를 정렬, 건너뛰기 및 제한하기 위해 find() 쿼리에 연결할 수 있는 커서 메서드를 제공합니다.

결과를 정렬하려면 .sort() 메서드를 사용합니다. 이 메서드는 정렬할 필드와 방향 (오름차순은 1, 내림차순은 -1) 을 지정하는 문서를 받습니다. 책을 연도별로 내림차순 (최신순) 으로 정렬해 보겠습니다.

db.books.find().sort({ year: -1 });

반환되는 문서 수를 제한하려면 .limit() 메서드를 사용합니다. 예를 들어, 최신 책 2 권만 가져오려면 다음과 같이 합니다.

db.books.find().sort({ year: -1 }).limit(2);

.skip() 메서드는 결과 세트 시작 부분에서 지정된 수의 문서를 건너뛰는 데 사용됩니다. 이는 페이지 매김 구현에 유용합니다. 모든 책을 검색하지만 첫 번째 책은 건너뛰겠습니다.

db.books.find().sort({ year: 1 }).skip(1);

이러한 메서드를 함께 연결하여 강력하고 정확한 쿼리를 만들 수 있습니다. 예를 들어, 컬렉션에서 두 번째로 오래된 책을 찾으려면 연도별로 오름차순으로 정렬하고 첫 번째 결과를 건너뛴 다음 출력을 하나로 제한할 수 있습니다.

db.books.find().sort({ year: 1 }).skip(1).limit(1);

이 명령은 2022 년에 출판된 "Python Basics" 책을 반환합니다.

마지막으로 MongoDB 셸을 종료하려면 exit를 입력하거나 Ctrl+D를 누릅니다.

exit;

요약

이 실습에서는 MongoDB 에서 기본 쿼리를 작성하는 기본 사항을 배웠습니다. mongosh 셸을 사용하여 데이터베이스에 연결하고 컬렉션에 문서를 삽입하는 것부터 시작했습니다. 그런 다음 find()를 사용하여 문서를 검색하고, 정확히 일치하는 항목 및 $gt, $in과 같은 비교 연산자를 사용하여 결과를 필터링하고, 프로젝션을 사용하여 특정 필드를 선택하는 연습을 했습니다. 마지막으로 결과 세트의 순서와 크기를 제어하기 위해 .sort(), .limit(), .skip()과 같은 커서 메서드를 연결하여 출력을 형식화하는 방법을 배웠습니다. 이러한 기술은 MongoDB 에서 데이터와 상호 작용하고 관리하는 기초를 형성합니다.