rand(집계)
정의
행동
$rand
가 호출될 때마다 소수점 이하 최대 17자리의 부동 소수점 값을 반환합니다. 뒤의 0은 제거되므로 실제 자릿수는 달라질 수 있습니다.
예시
무작위 데이터 포인트 생성
이 예시는 자선 기부를 모델링합니다. collection은 기부자 목록으로 시작됩니다.
db.donors.insertMany( [ { donorId: 1000, amount: 0, frequency: 1 }, { donorId: 1001, amount: 0, frequency: 2 }, { donorId: 1002, amount: 0, frequency: 1 }, { donorId: 1003, amount: 0, frequency: 2 }, { donorId: 1004, amount: 0, frequency: 1 } ] )
집계 파이프라인을 사용하여 각 문서를 무작위 기부 금액으로 업데이트합니다.
db.donors.aggregate( [ { $set: { amount: { $multiply: [ { $rand: {} }, 100 ] } } }, { $set: { amount: { $floor: "$amount" } } }, { $merge: "donors" } ] )
첫 번째 $set
단계는 amount
필드 를 업데이트합니다. 0 ~ 1 사이의 초기값은 $rand
을 사용하여 생성됩니다. 그런 다음 $multiply
은 이를 상향 100 배 확장합니다.
두 번째 $set
단계의 $floor
연산자는 amount
에서 소수점 부분을 제거하여 정수값을 남깁니다.
마지막으로 $merge
는 이전 단계에서 만든 임의 값을 amount
필드에 쓰고 donors
컬렉션의 각 문서에 대해 값을 업데이트합니다.
프로젝션 스테이지를 통해 결과를 확인할 수 있습니다.
db.donors.aggregate( [ { $project: {_id: 0, donorId: 1, amount: 1 } } ] )
프로젝션에서는 조정된 금액이 이제 0에서 99 사이의 임의값임을 보여 줍니다.
{ "donorId" : 1000, "amount" : 27 } { "donorId" : 1001, "amount" : 10 } { "donorId" : 1002, "amount" : 88 } { "donorId" : 1003, "amount" : 73 } { "donorId" : 1004, "amount" : 5 }
컬렉션에서 임의 항목 선택
집계 파이프라인에서 $rand
를 사용하여 컬렉션에서 임의의 문서를 선택할 수 있습니다. 유권자 기록 컬렉션을 가정해 보겠습니다.
db.voters.insertMany( [ { name: "Archibald", voterId: 4321, district: 3, registered: true }, { name: "Beckham", voterId: 4331, district: 3, registered: true }, { name: "Carolin", voterId: 5321, district: 4, registered: true }, { name: "Debarge", voterId: 4343, district: 3, registered: false }, { name: "Eckhard", voterId: 4161, district: 3, registered: false }, { name: "Faberge", voterId: 4300, district: 1, registered: true }, { name: "Grimwald", voterId: 4111, district: 3, registered: true }, { name: "Humphrey", voterId: 2021, district: 3, registered: true }, { name: "Idelfon", voterId: 1021, district: 4, registered: true }, { name: "Justo", voterId: 9891, district: 3, registered: false } ] )
3선거구의 유권자 중 절반 정도를 선택하여 투표를 실시한다고 가정해 보겠습니다.
db.voters.aggregate( [ { $match: { district: 3 } }, { $match: { $expr: { $lt: [0.5, {$rand: {} } ] } } }, { $project: { _id: 0, name: 1, registered: 1 } } ] )
첫 번째 파이프라인 단계에서는 유권자가 3 선거구 출신인 모든 문서를 일치시킵니다.
두 번째 $match
단계에서는 일치 표현식 $rand
을 사용하여 선택 항목을 더욱 세분화합니다. 각 문서에 대해 $rand
는 0에서 1 사이의 값을 생성합니다. ($lt)
미만 비교에서 0.5
의 임계값은 $expr
이 문서의 약 절반에 대해 참임을 의미합니다.
$project
단계에서 선택한 문서가 필터링되어 name
및 registered
필드를 반환합니다. 3 선거구에는 7명의 유권자가 있으며, 코드를 실행하면 그 중 절반 정도가 선택됩니다.
{ "name" : "Archibald", "registered" : true } { "name" : "Debarge", "registered" : false } { "name" : "Humphrey", "registered" : true }
참고
선택한 문서 수는 매번 다릅니다. 정확한 문서 수를 선택해야 하는 경우, $rand
대신 $sample
을 사용하는 것이 좋습니다.