MongoDB 결과 정렬 및 제한

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 MongoDB 쿼리 기법의 기본 사항을 배우게 됩니다. 여기에는 데이터베이스 결과 정렬, 제한 및 필터링이 포함됩니다. 이러한 기술은 데이터를 효율적으로 관리하고 검색하는 데 필수적입니다. MongoDB 셸 (mongosh) 을 사용하여 샘플 문서 컬렉션에 대한 이러한 작업을 수행합니다.

이 랩에서는 단일 또는 여러 필드로 문서를 정렬하고, limit 및 offset 을 사용하여 반환되는 결과 수를 제어하며, 특정 기준과 일치하는 문서를 세는 방법을 안내합니다. 이 랩이 끝나면 MongoDB 데이터베이스에서 데이터를 구성하고 검색하는 방법에 대한 탄탄한 이해를 갖게 될 것입니다.

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

단일 필드로 문서 정렬

이 단계에서는 MongoDB 컬렉션의 문서를 정렬하는 방법을 배웁니다. 정렬을 사용하면 쿼리 결과를 특정 순서로 구성할 수 있으며, 이는 데이터 분석 및 프레젠테이션에 매우 중요합니다. 여러분의 환경에는 books 컬렉션을 포함하는 bookstore 데이터베이스가 미리 구성되어 있습니다.

먼저 MongoDB 셸을 열어 데이터베이스와 상호 작용합니다. 터미널에서 다음 명령을 실행합니다.

mongosh

셸에 접속한 후 bookstore 데이터베이스로 전환합니다.

use bookstore

books 컬렉션의 문서를 보려면 find() 메서드를 사용할 수 있습니다.

db.books.find();

이제 이 문서들을 정렬해 보겠습니다. 단일 필드로 정렬하려면 find() 쿼리에 .sort() 메서드를 연결합니다. sort() 메서드는 정렬할 필드와 방향을 지정하는 객체를 받습니다. 방향은 오름차순의 경우 1, 내림차순의 경우 -1입니다.

페이지 수가 적은 순서대로 (가장 적은 페이지부터 많은 페이지까지) 책을 정렬해 보겠습니다.

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

가장 적은 페이지를 가진 책인 "Python Basics"가 먼저 나열된 것을 볼 수 있습니다.

[
  {
    _id: ObjectId('...'),
    title: 'Python Basics',
    pages: 250,
    price: 29.99
  },
  {
    _id: ObjectId('...'),
    title: 'MongoDB Fundamentals',
    pages: 300,
    price: 34.99
  },
  ...
]

다음으로, 가장 비싼 책을 먼저 찾기 위해 가격별로 책을 내림차순으로 정렬해 보겠습니다.

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

이 명령은 가장 높은 가격을 가진 "Data Science"를 맨 위에 표시합니다.

[
  {
    _id: ObjectId('...'),
    title: 'Data Science',
    pages: 350,
    price: 44.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  ...
]

여러 필드로 정렬

때로는 단일 필드로 정렬하는 것만으로는 충분하지 않습니다. MongoDB 는 더 세분화된 순서를 만들기 위해 정렬을 위한 여러 키를 지정할 수 있도록 합니다. 이 단계에서는 필드 시퀀스를 기반으로 문서를 정렬하는 방법을 배웁니다.

다중 키 정렬을 더 잘 설명하기 위해 컬렉션에 몇 권의 책을 더 추가해 보겠습니다. 이 새 책들은 기존 책과 동일한 가격을 공유하지만 페이지 수는 다릅니다.

db.books.insertMany([
  { title: "Machine Learning", pages: 420, price: 39.99 },
  { title: "Web Development", pages: 380, price: 39.99 }
]);

이제 가격이 $39.99인 책이 세 권 있습니다. 가격만으로 정렬하면 이 세 권의 책 순서가 보장되지 않습니다. 예측 가능한 순서를 만들기 위해 두 번째 정렬 키를 추가할 수 있습니다.

먼저 price별로 오름차순으로 책을 정렬하고, 동일한 가격의 책은 pages별로 내림차순으로 정렬해 보겠습니다.

db.books.find().sort({ price: 1, pages: -1 });

쿼리 프로세서는 먼저 모든 문서를 price별로 정렬합니다. 그런 다음, price가 동일한 문서 (예: $39.99인 세 권의 책) 에 대해서는 pages별로 내림차순으로 정렬합니다.

$39.99 책에 대한 출력은 다음 순서로 나타나야 합니다.

  1. "Machine Learning" (420 페이지)
  2. "JavaScript Advanced" (400 페이지)
  3. "Web Development" (380 페이지)
[
  ...,
  {
    _id: ObjectId('...'),
    title: 'Machine Learning',
    pages: 420,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  },
  ...
]

이 기법은 사용자 인터페이스 및 보고서를 위한 복잡하고 안정적인 정렬을 만드는 데 유용합니다.

결과 제한 및 건너뛰기

대규모 데이터 세트를 다룰 때 결과의 일부만 검색해야 하는 경우가 많습니다. MongoDB 는 이러한 목적으로 .limit().skip() 메서드를 제공합니다. 이 두 메서드는 페이지네이션 (pagination) 구현의 기초가 됩니다.

.limit() 메서드는 쿼리에서 반환되는 문서 수를 제한합니다. 가장 비싼 책 상위 3 권만 검색해 보겠습니다.

db.books.find().sort({ price: -1 }).limit(3);

이 명령은 먼저 모든 책을 가격 내림차순으로 정렬한 다음, 정렬된 목록에서 처음 세 개의 문서만 반환합니다.

.skip() 메서드는 커서에게 결과 세트 시작 부분의 지정된 수만큼 문서를 건너뛰도록 지시합니다. 이는 데이터 페이지를 탐색하는 데 유용합니다.

예를 들어, 각 페이지에 2 권의 책이 있는 결과의 두 번째 페이지를 가져오려면 처음 2 권의 책을 건너뛰고 결과를 2 권으로 제한해야 합니다. 이를 가격별로 정렬된 목록에 적용하여 세 번째와 네 번째로 비싼 책을 가져와 보겠습니다.

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

이 쿼리는 다음 작업을 순서대로 수행합니다.

  1. sort({ price: -1 }): 모든 책을 가장 비싼 것부터 가장 저렴한 것 순으로 정렬합니다.
  2. skip(2): 가장 비싼 책 상위 2 권을 건너뜁니다.
  3. limit(2): 목록에서 다음 2 권의 책을 반환합니다.

출력에는 정렬된 목록의 세 번째와 네 번째 책이 표시됩니다.

[
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  }
]

skip()limit()의 값을 조정하여 완전한 페이지네이션 시스템을 구현할 수 있습니다.

문서 개수 세기

또 다른 일반적인 요구 사항은 컬렉션의 문서 수를 세는 것입니다. 이는 전체 문서 수이거나 특정 필터와 일치하는 문서 수일 수 있습니다. MongoDB 는 이를 위해 countDocuments() 메서드를 제공합니다.

컬렉션에 있는 책의 총 수를 얻으려면 다음 명령을 실행하십시오.

db.books.countDocuments();

이 명령은 문서의 총 개수를 반환하며, 2 단계에서 추가한 후에는 6이어야 합니다.

더 강력하게는, countDocuments()는 특정 기준과 일치하는 문서만 세기 위해 쿼리 필터를 받을 수 있습니다. 가격이 35 달러를 초과하는 책이 몇 권인지 세어 보겠습니다. 이를 위해 $gt (greater than, 보다 큼) 쿼리 연산자를 사용합니다.

db.books.countDocuments({ price: { $gt: 35 } });

이 명령은 가격이 35 보다 큰 책의 수를 반환합니다.

필터에 여러 조건을 사용할 수도 있습니다. 가격이 정확히 $39.99이고 페이지 수가 400 페이지 이상인 책의 수를 세어 보겠습니다. 여기서는 $gte (greater than or equal to, 보다 크거나 같음) 연산자를 사용합니다.

db.books.countDocuments({ price: 39.99, pages: { $gte: 400 } });

이 명령은 "Machine Learning"(420 페이지) 과 "JavaScript Advanced"(400 페이지) 에 해당하는 2를 반환합니다. 필터와 함께 countDocuments()를 사용하는 것은 문서를 직접 검색하지 않고 데이터에 대한 통계를 효율적으로 얻는 방법입니다.

MongoDB 셸을 종료하려면 exit를 입력하거나 Ctrl+D를 누르면 됩니다.

exit;

요약

이 실습에서는 몇 가지 필수적인 MongoDB 쿼리 기법을 배웠습니다. .sort() 메서드를 사용하여 단일 필드로 오름차순 및 내림차순으로 문서를 정렬하는 것부터 시작했습니다. 그런 다음 더 복잡하고 안정적인 결과 정렬을 가능하게 하는 다중 키 정렬 (multi-key sorting) 로 발전했습니다.

다음으로, 반환되는 문서 수를 제한하기 위해 .limit()를 사용하고 페이지네이션을 구현하기 위해 .skip()을 사용하여 결과 세트 크기를 제어하는 방법을 탐색했습니다. 마지막으로, 전체 컬렉션의 문서 수와 특정 필터 기준과 일치하는 문서 수를 효율적으로 세기 위해 countDocuments()를 사용하는 방법을 배웠습니다. 이러한 명령은 MongoDB 를 사용하는 모든 개발자에게 기본적인 도구입니다.