HTTP GET 요청에서 쿼리 파라미터와 MongoDB를 사용하여 정렬과 페이징을 구현하는 방법을 정리해 보았습니다.
몇 가지 예시와 함께 쿼리 파라미터를 사용하여 정렬과 페이징을 요청하는 방법을 살펴 보도록 하겠습니다.
정렬 요청:
GET /articles?sort=publication_date
이 요청을 통해 논문이나 기사를 출판 날짜 기준으로 정렬할 수 있습니다. 예를 들어, 출판 날짜를 기준으로 최신순 또는 오래된 순으로 데이터를 조회할 수 있습니다.
페이징 요청:
GET /articles?offset=10&size=10
전체 논문 목록에서 10번부터 19번까지의 데이터를 조회합니다. 이를 통해 사용자는 필요한 논문만 선택적으로 볼 수 있습니다.
정렬과 페이징 모두 적용:
GET /articles?sort=publication_date&offset=10&size=10
출판 날짜 기준으로 정렬된 논문 목록의 특정 부분만 조회할 수 있습니다. 이는 대량의 과학 데이터를 효과적으로 처리하는 데 유용합니다.
MongoDB의 find 메소드에 sort, limit, skip 메소드를 사용하여 페이지네이션과 정렬을 구현하는 방법입니다.
temp = db_scientific_papers.find({}, {'title': 1, 'author': 1, '_id': 0}).skip(10).limit(10)
이 코드는 논문 데이터베이스에서 11번째부터 20번째까지의 논문을 가져오는 예시입니다. skip
은 건너뛸 논문의 수를, limit
은 가져올 논문의 수를 지정합니다.
temp = db_scientific_papers.find({}, {'title': 1, 'author': 1, 'impact_factor': 1, '_id': 0}).sort('impact_factor', pymongo.DESCENDING)
논문의 영향력 지수(impact_factor
)를 기준으로 내림차순 정렬하는 방법입니다. pymongo.DESCENDING
옵션을 사용하여 높은 영향력 지수를 가진 논문이 먼저 나오도록 정렬할 수 있습니다.
위에 설명한 내용을 바탕으로 정렬과 페이징만 적용한 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의 메소드를 활용하여 정렬과 페이징을 구현함으로써, 데이터를 효과적으로 관리하고 사용자에게 필요한 정보를 빠르게 제공할 수 있습니다.