정의
버전 5.0에서 변경됨
호환성
다음 환경에서 호스팅되는 배포에 $expr 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
{ $expr: { <expression> } }
인수는 유효한 모든 표현식일 수 있습니다.
행동
$lookup 작업의 $expr
$lookup 하위 단계에 속해 있는 $match 단계에 $expr이 나타나는 경우 $expr은 $lookup 단계에서 정의된 let 변수를 참조할 수 있습니다. 예시는 다중 조인 조건 및 상관관계 하위 쿼리 사용을 참조하세요.
$expr 연산자에 배치된 $eq, $lt, $lte, $gt 및 $gte 비교 연산자는 $lookup 단계에서 참조된 from 컬렉션의 인덱스를 사용할 수 있습니다. 제한 사항:
예시
이 페이지의 예시에서는 sample_mflix 샘플 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예시를 실행 하려면 데이터베이스를 제거하고 다시 만들어야 할 수 있습니다.
단일 문서에서 두 필드 비교
$expr 동일한 문서의 필드를 비교하는 표현식이 포함될 수 있습니다.
다음 작업은 을 사용하여 $expr 컬렉션 movies 에서 로튼 토마토의 뷰어 평점이 비평가 평점을 초과하는 문서를 찾습니다.
db.movies.find( { $expr: { $gt: [ "$tomatoes.viewer.rating", "$tomatoes.critic.rating" ] } }, { _id: 0, title: 1, "tomatoes.viewer.rating": 1, "tomatoes.critic.rating": 1 } ).sort( { "tomatoes.viewer.rating": -1 } ).limit( 3 )
[ { title: 'I Am Maria', tomatoes: { viewer: { rating: 5 } } }, { title: 'Kadin Hamlet', tomatoes: { viewer: { rating: 5 } } }, { title: 'The Seine Meets Paris', tomatoes: { viewer: { rating: 5 } } } ]
조건문과 함께 $expr 사용
일부 쿼리는 쿼리 필터하다 정의할 때 조건부 로직을 실행해야 합니다. 집계 $cond 파이프라인 조건문을 표현하는 연산자 제공합니다. 를 연산자 와 함께 $expr $cond 사용하면 쿼리 성명서 에 조건부 필터하다 지정할 수 있습니다.
영화에 대한 가중치 점수를 계산하여 투표 수가 적은 높은 평점을 받은 영화가 결과를 차지하지 않도록 한다고 가정해 보겠습니다.
imdb.votes이(가) 1000 이상인 경우 가중치 점수는 전체imdb.rating이(가) 됩니다.imdb.votes가 1000 미만인 경우 가중치 점수는imdb.rating의 0.5 입니다.
movies 컬렉션 에서 가중치 점수가 9보다 큰 영화를 알고 싶습니다.
다음 예시 $expr 과 을 사용하여 를 기준으로 가중치 $cond 점수를 imdb.votes 계산하고 을 사용하여 $gt 계산된 가중치 점수가 보다 큰 문서를 9 반환합니다.
db.movies.find( { "imdb.rating": { $type: "number" }, "imdb.votes": { $type: "number" }, $expr: { $gt: [ { $cond: { if: { $gte: ["$imdb.votes", 1000] }, then: { $multiply: ["$imdb.rating", 1.0] }, else: { $multiply: ["$imdb.rating", 0.5] } } }, 9 ] } }, { _id: 0, title: 1, "imdb.rating": 1, "imdb.votes": 1 } ).sort( { title: 1 } ).limit(5)
다음 표에는 선택한 문서에 대한 가중치 점수와 가중치 점수가 9 보다 큰지 여부(즉, 문서 쿼리 조건을 충족하는지 여부)가 나와 있습니다.
문서 | 가중 점수 | > 9 |
|---|---|---|
| 9.3 |
|
| 9.2 |
|
| 8.9 |
|
| 9.5 |
|
| 4.55 |
|
db.collection.find() 작업은 5 계산된 가중치 점수가 보다 큰 문서를 반환합니다.9
[ { title: 'Band of Brothers', imdb: { rating: 9.6, votes: 183802 } }, { title: 'Baseball', imdb: { rating: 9.1, votes: 2460 } }, { title: 'Cosmos', imdb: { rating: 9.3, votes: 17174 } }, { title: 'Frozen Planet', imdb: { rating: 9.2, votes: 5903 } }, { title: 'Human Planet', imdb: { rating: 9.2, votes: 9057 } } ]
$cond 가 가중치 점수를 계산하더라도 해당 점수는 반환된 문서에 반영되지 않습니다. 대신 반환된 문서는 원래 상태 의 일치하는 문서를 나타냅니다.