파이썬 앱에서 pymongo를 사용하는 경우 만약 임의의 document를 랜덤하게 가져오려면 어떻게 하는지 알아봅니다.



# pymongo 랜덤 document 선택, 가져오기
먼저 방법을 생각해보면 아래와 같이 두 가지 방법이 있습니다.

하나. 전체 개수를 계산한 후 임의의 수를 구하여 skip()을 사용하는 방법
; 전체 개수를 알면 이 값보다 작은 임의의 수를 skip()하여 핸덤한 document를 선택할 수 있을 것입니다.

위의 방법도 매우 간단한 방법이지만 전체 개수를 구하는 쿼리와 랜덤한 값을 구하는 로직이 필요합니다. 그래서 더 단순한 방법을 아래에서 알아봅니다.


하나. aggregate()의 $sample 사용 방법
이 방법은 MongoDB 내부에서 한 번의 쿼리만 사용해 임의의 도큐멘트를 반환하므로 가장 간단한 방법이라 할 수 있습니다.

collection.aggregate([{'$sample': { 'size': 1 } }])

간단한 문법입니다. 위에서 size는 반환될 개수를 입력합니다. 그럼 간단한 예제를 만들어보겠습니다.


! 파이썬에서 pymongo 랜덤 값 구하기 예제
그럼 이 방법을 사용하는 간단한 예제를 만들어봅니다. 먼저 임의의 값을 MongoDB에서 가져오는 파이션 함수 getRandom()함수를 만듭니다.
def getRandom(_collection):
  collection = db[_collection]
  query = { '$sample': { 'size': 1 } }
  cursor = collection.aggregate([query])

  return cursor

(여기서 db는 MongoDB 데이터베이스의 connection임)
함수 getRandom은 컬랙션 이름인 collection을 인자로 받습니다. 즉 어떤 컬렉션에서 랜덤 값을 가져올 지 선택할 수 있으며 결과값 document를 cursor객체로 반환합니다.

이제 웹에서 불러올 수 있도록 위 함수를 사용하는 파이썬 코드를 작성해봅니다.
_collection = 'siteName'
_result = getRandom(_collection)

results = []
for item in list(_result):
  results.append(item)

return toJson(results)

위 코드는 아래의 순서대로 수행하게 됩니다.

  • 1. getRandom() 함수를 실행
  • 2. 반환된 값 커서 객체를 리스트 타입으로 변환
  • 3. toJson() 함수를 사용해 리스트 타입을 JSON타입으로 변환

이제 모든 코드와 완성되었습니다. 참고로 위 코드에서 toJSON()은 생략되었으며 파이썬의 리스트 타입을 JSON으로 변환해 반환하는 함수입니다.