Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 무작위(랜덤) 레코드 조회하기 – $sample 집계 연산자 완벽 가이드

MongoDB 컬렉션에서 무작위(랜덤) 문서를 하나 가져오고 싶다면 aggregate() 함수$sample 파이프라인 단계를 활용하면 됩니다. 이 방법은 별도의 복잡한 로직 없이 간단한 쿼리 한 줄로 랜덤 데이터를 추출할 수 있어 매우 유용합니다.

$sample을 사용한 기본 문법

MongoDB에서 임의의 레코드를 가져오는 기본 문법은 다음과 같습니다.

db.yourCollectionName.aggregate([{$sample:{size:1}}]);

여기서 size 값은 추출하고자 하는 문서의 개수를 의미합니다. 1로 설정하면 컬렉션에서 임의의 문서 하나를 반환합니다.

예제 컬렉션 생성하기

실제 동작을 확인하기 위해 직원 정보를 담은 컬렉션을 만들어 보겠습니다. 아래 쿼리로 employeeInformation 컬렉션에 문서를 삽입합니다.

> db.employeeInformation.insert({"EmployeeId":1,"EmployeeName":"Maxwell","EmployeeAge":26});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":2,"EmployeeName":"David","EmployeeAge":25});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":3,"EmployeeName":"Carol","EmployeeAge":24});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":4,"EmployeeName":"Bob","EmployeeAge":28});
WriteResult({ "nInserted" : 1 })
> db.employeeInformation.insert({"EmployeeId":5,"EmployeeName":"Sam","EmployeeAge":27});
WriteResult({ "nInserted" : 1 })

저장된 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.employeeInformation.find().pretty();

실행 결과는 다음과 같습니다.

{
    "_id" : ObjectId("5c6d3079734e98fc0a434ae5"),
    "EmployeeId" : 1,
    "EmployeeName" : "Maxwell",
    "EmployeeAge" : 26
}
{
    "_id" : ObjectId("5c6d308c734e98fc0a434ae6"),
    "EmployeeId" : 2,
    "EmployeeName" : "David",
    "EmployeeAge" : 25
}
{
    "_id" : ObjectId("5c6d309d734e98fc0a434ae7"),
    "EmployeeId" : 3,
    "EmployeeName" : "Carol",
    "EmployeeAge" : 24
}
{
    "_id" : ObjectId("5c6d30ab734e98fc0a434ae8"),
    "EmployeeId" : 4,
    "EmployeeName" : "Bob",
    "EmployeeAge" : 28
}
{
    "_id" : ObjectId("5c6d30bb734e98fc0a434ae9"),
    "EmployeeId" : 5,
    "EmployeeName" : "Sam",
    "EmployeeAge" : 27
}

랜덤 레코드 조회 실행하기

이제 $sample을 사용해 임의의 레코드 하나를 가져오는 쿼리를 실행해 보겠습니다.

> db.employeeInformation.aggregate([{$sample:{size:1}}]).pretty();

첫 번째 실행 결과입니다.

{
    "_id" : ObjectId("5c6d30bb734e98fc0a434ae9"),
    "EmployeeId" : 5,
    "EmployeeName" : "Sam",
    "EmployeeAge" : 27
}

동일한 쿼리를 다시 한번 실행하면, 실행할 때마다 다른 문서가 무작위로 선택되는 것을 확인할 수 있습니다.

> db.employeeInformation.aggregate([{$sample:{size:1}}]).pretty();

두 번째 실행 결과입니다.

{
    "_id" : ObjectId("5c6d308c734e98fc0a434ae6"),
    "EmployeeId" : 2,
    "EmployeeName" : "David",
    "EmployeeAge" : 25
}

정리 및 참고 사항

이처럼 MongoDB에서는 aggregate([{$sample:{size:N}}]) 구문만으로 손쉽게 랜덤 데이터를 추출할 수 있습니다. 몇 가지 추가로 알아두면 좋은 점은 다음과 같습니다.

1. 여러 개의 랜덤 문서 추출: size 값을 원하는 개수로 변경하면 됩니다. 예를 들어 {$sample:{size:3}}으로 설정하면 무작위 문서 3개가 반환됩니다.

2. 성능 관련 주의점: $sample은 컬렉션 크기가 작을 경우(대략 5% 미만, 100MB 이하) 메모리 내에서 빠르게 처리되지만, 대용량 컬렉션에서는 전체 컬렉션 스캔이 발생할 수 있으므로 성능에 유의해야 합니다.

3. 중복 없는 샘플링: $sample은 항상 중복 없이(distinct) 문서를 선택하므로, 동일한 문서가 결과에 두 번 포함되지 않습니다.