Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

$expr (쿼리 자 연산자)

버전 5.0에서 변경됨

$expr

쿼리 조건자 내에서 표현식을 사용할 수 있습니다.

다음 환경에서 호스팅되는 배포에 $expr 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

{ $expr: { <expression> } }

인수는 유효한 모든 표현식일 수 있습니다.

$lookup 하위 단계에 속해 있는 $match 단계에 $expr이 나타나는 경우 $expr$lookup 단계에서 정의된 let 변수를 참조할 수 있습니다. 예시는 다중 조인 조건 및 상관관계 하위 쿼리 사용을 참조하세요.

$expr 연산자에 배치된 $eq, $lt, $lte, $gt$gte 비교 연산자는 $lookup 단계에서 참조된 from 컬렉션의 인덱스를 사용할 수 있습니다. 제한 사항:

  • 인덱스는 필드와 상수 간의 비교에만 사용할 수 있으므로 let 피연산자는 상수로 해결되어야 합니다.

    예를 들어 $a 및 상수 값 간의 비교에는 인덱스를 사용할 수 있지만, $a$b 간의 비교에는 인덱스를 사용할 수 없습니다.

  • let 피연산자가 비어 있거나 누락된 값으로 확인되는 비교에는 인덱스가 사용되지 않습니다.

  • 멀티키, 부분 또는 희소 인덱스는 사용되지 않습니다.

이 페이지의 예시에서는 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 } } }
]

일부 쿼리는 쿼리 필터하다 정의할 때 조건부 로직을 실행해야 합니다. 집계 $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

{ title: "The Shawshank Redemption", imdb: { rating: 9.3, votes: 1521105 } }

9.3

true

{ title: "The Godfather", imdb: { rating: 9.2, votes: 1038358 } }

9.2

true

{ title: "Fight Club", imdb: { rating: 8.9, votes: 1191784 } }

8.9

false

{ title: "Planet Earth", imdb: { rating: 9.5, votes: 82896 } }

9.5

true

{ title: "Hollywood", imdb: { rating: 9.1, votes: 511 } }

4.55

false

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 가 가중치 점수를 계산하더라도 해당 점수는 반환된 문서에 반영되지 않습니다. 대신 반환된 문서는 원래 상태 의 일치하는 문서를 나타냅니다.

돌아가기

기타

이 페이지의 내용