MongoDB의 메소드를 활용한 페이지네이션

Dev Smile·2024년 7월 31일
1

FastAPI

목록 보기
2/10

HTTP GET 요청에서 쿼리 파라미터와 MongoDB를 사용하여 정렬과 페이징을 구현하는 방법을 정리해 보았습니다.

1. 쿼리 파라미터에서 정렬과 페이징 요청하는 방법

몇 가지 예시와 함께 쿼리 파라미터를 사용하여 정렬과 페이징을 요청하는 방법을 살펴 보도록 하겠습니다.

  • 정렬 요청:
    GET /articles?sort=publication_date
    이 요청을 통해 논문이나 기사를 출판 날짜 기준으로 정렬할 수 있습니다. 예를 들어, 출판 날짜를 기준으로 최신순 또는 오래된 순으로 데이터를 조회할 수 있습니다.

  • 페이징 요청:
    GET /articles?offset=10&size=10
    전체 논문 목록에서 10번부터 19번까지의 데이터를 조회합니다. 이를 통해 사용자는 필요한 논문만 선택적으로 볼 수 있습니다.

  • 정렬과 페이징 모두 적용:
    GET /articles?sort=publication_date&offset=10&size=10
    출판 날짜 기준으로 정렬된 논문 목록의 특정 부분만 조회할 수 있습니다. 이는 대량의 과학 데이터를 효과적으로 처리하는 데 유용합니다.

2. MongoDB를 활용한 페이지네이션과 정렬

MongoDB의 find 메소드에 sort, limit, skip 메소드를 사용하여 페이지네이션과 정렬을 구현하는 방법입니다.

  • 페이지네이션 (skip과 limit):
temp = db_scientific_papers.find({}, {'title': 1, 'author': 1, '_id': 0}).skip(10).limit(10) 

이 코드는 논문 데이터베이스에서 11번째부터 20번째까지의 논문을 가져오는 예시입니다. skip은 건너뛸 논문의 수를, limit은 가져올 논문의 수를 지정합니다.

  • 정렬 (sort):
temp = db_scientific_papers.find({}, {'title': 1, 'author': 1, 'impact_factor': 1, '_id': 0}).sort('impact_factor', pymongo.DESCENDING)

논문의 영향력 지수(impact_factor)를 기준으로 내림차순 정렬하는 방법입니다. pymongo.DESCENDING 옵션을 사용하여 높은 영향력 지수를 가진 논문이 먼저 나오도록 정렬할 수 있습니다.

3. FastAPI 예제

위에 설명한 내용을 바탕으로 정렬과 페이징만 적용한 FastAPI 예제를 만들어 보았습니다.

from fastapi import FastAPI, Query
from typing import List, Optional
from pymongo import MongoClient, DESCENDING, ASCENDING
import pymongo

app = FastAPI()

# MongoDB 클라이언트 설정
client = MongoClient("mongodb://localhost:27017/")
db = client["scientific_database"]
collection = db["papers"]

# 예시 데이터
# papers = [
#     {"title": "Paper A", "author": "Author 1", "publication_date": "2021-01-01", "impact_factor": 5.2},
#     {"title": "Paper B", "author": "Author 2", "publication_date": "2021-02-15", "impact_factor": 3.8},
#     {"title": "Paper C", "author": "Author 3", "publication_date": "2020-12-05", "impact_factor": 4.1},
#     {"title": "Paper D", "author": "Author 4", "publication_date": "2022-03-21", "impact_factor": 6.5},
# ]

@app.get("/articles/")
def get_articles(
    sort: Optional[str] = Query(None, description="정렬 기준 (예: 'publication_date' 또는 'impact_factor')"),
    offset: int = Query(0, ge=0, description="건너뛸 데이터의 수"),
    size: int = Query(10, gt=0, le=100, description="가져올 데이터의 수"),
) -> List[dict]:
    # 정렬 기준 설정
    sort_criteria = []
    if sort in ["publication_date", "impact_factor"]:
        sort_criteria.append((sort, DESCENDING))

    # 데이터베이스에서 데이터 가져오기
    cursor = collection.find(
        {},
        {"_id": 0, "title": 1, "author": 1, "publication_date": 1, "impact_factor": 1}
    ).skip(offset).limit(size)
    
    # 정렬 적용
    if sort_criteria:
        cursor = cursor.sort(sort_criteria)

    # 결과 반환
    return list(cursor)

이와 같은 방법으로 MongoDB의 메소드를 활용하여 정렬과 페이징을 구현함으로써, 데이터를 효과적으로 관리하고 사용자에게 필요한 정보를 빠르게 제공할 수 있습니다.

0개의 댓글

관련 채용 정보