문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

rand(집계)

이 페이지의 내용

  • 정의
  • 행동
  • 예제
$rand

호출될 때마다 0과 1 사이의 임의의 실수를 반환합니다.

$rand 의 구문은 다음과 같습니다:

{ $rand: {} }

$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 }
]
)

aggregation pipeline을 사용하여 각 문서를 무작위 기부 금액으로 업데이트합니다.

db.donors.aggregate(
[
{ $set: { amount: { $multiply: [ { $rand: {} }, 100 ] } } },
{ $set: { amount: { $floor: "$amount" } } },
{ $merge: "donors" }
]
)

첫 번째 $set 단계에서는 amount 필드를 업데이트합니다. $rand를 사용하여 0과 1 사이의 초기값을 생성합니다. 그런 다음 $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 }

aggregation pipeline에서 $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 단계에서 선택한 문서가 필터링되어 nameregistered 필드를 반환합니다. 3 선거구에는 7명의 유권자가 있으며, 코드를 실행하면 그 중 절반 정도가 선택됩니다.

{ "name" : "Archibald", "registered" : true }
{ "name" : "Debarge", "registered" : false }
{ "name" : "Humphrey", "registered" : true }

참고

선택한 문서 수는 매번 다릅니다. 정확한 문서 수를 선택해야 하는 경우, $rand 대신 $sample을 사용하는 것이 좋습니다.

다음도 참조하세요.

← 라디안 투 도수(집계)

이 페이지의 내용