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

$and (쿼리 자 연산자)

$and

$and는 하나 이상의 표현식으로 구성된 배열에 대해 논리적 AND 작업을 수행하고, 모든 표현식을 충족하는 문서를 선택합니다.

참고

MongoDB는 쉼표로 구분된 표현식 목록을 지정할 때 암시적 AND 작업을 제공합니다.

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

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

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

$and의 구문은 다음과 같습니다.

{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

MongoDB의 쿼리 옵티마이저는 $and 표현식의 절을 평가할 때 실행할 최상의 계획을 선택$and 표현식의 절을 충족하는 데 도움이 될 수 있는 인덱스를 고려합니다.

쿼리 엔진이 쿼리를 최적화할 수 있도록 $and 은 다음과 같이 오류를 처리합니다:

  • $and에 제공된 표현식이 단독으로 평가될 때 오류가 발생하는 경우, 표현식이 포함된 $and이 오류를 일으킬 수 있지만 오류가 보장되지는 않습니다.

  • $and에 제공된 첫 번째 표현식 뒤에 제공된 표현식은 첫 번째 표현식이 false로 평가되더라도 오류를 일으킬 수 있습니다.

예를 들어, 다음 쿼리는 $x0인 경우 항상 오류를 생성합니다.

db.example.find( {
$expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )

$and에 제공된 여러 표현식이 포함된 다음 쿼리에서 $x0인 문서가 있는 경우 오류가 발생할 수 있습니다.

db.example.find( {
$and: [
{ x: { $ne: 0 } },
{ $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
]
} )

MongoDB Shell ()을 포함한 대부분의 프로그래밍 언어 및mongosh 드라이버는 동일한 객체 수준에서 중복 키가 있는 객체 생성을 허용하지 않습니다. 예시 들어 와 { $ne: "R", $ne: "PG" } 같은 조건을 지정하면 두 번째 값이 첫 번째 값을 재정의합니다.

여러 조건을 확인하려면 명시적 AND를 사용합니다.

db.movies.find( {
$and: [
{ genres: { $in: [ "News", "Talk-Show" ] } },
{ genres: { $in: [ "History", "Western" ] } }
]},
{ title: 1, genres: 1, year: 1 }
)

이전 쿼리 두 조건이 모두 충족되는지 명시적으로 확인합니다. 즉,genres 배열 각 설정하다 에서 하나 이상의 값을 포함해야 합니다.$in

이 페이지의 예시에서는 sample_mflix 샘플 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예시를 실행 하려면 데이터베이스를 제거하고 다시 만들어야 할 수 있습니다.

$and 동일한 필드 에 있는 여러 표현식과 일치합니다.

다음 쿼리를 고려해보세요.

db.movies.find(
{ $and: [ { year: { $gte: 1960 } }, { year: { $lte: 1970 } }, { directors: "Martin Scorsese" } ] },
{ title: 1, directors: 1, year: 1 })

이 쿼리는 movies collection의 모든 문서를 선택합니다. 이 때,

  • year 1960 이상이고

  • year 1970 이하이고

  • directors 은(는)Martin Scorsese를 포함합니다.

또한 title, directorsyear 필드만 포함하도록 결과를 프로젝션합니다. 쿼리 다음 문서를 반환합니다.

[
{
"_id": "573a1395f29313caabce2f95",
"title": "The Big Shave",
"directors": [ "Martin Scorsese" ],
"year": 1968
},
{
"_id": "573a1396f29313caabce3889",
"title": "Who's That Knocking at My Door",
"directors": [ "Martin Scorsese" ],
"year": 1967
}
]

year 필드 에 대한 연산자를 단일 쿼리 객체 로 결합하고 암시적 AND 연산자를 사용하여 이 쿼리 간소화할 수 있습니다.

db.movies.find(
{ year: { $gte:1960, $lte:1970 }, directors:'Martin Scorsese' },
{ title: 1, directors: 1, year: 1 })

항상 쿼리 검토 의도한 동작과 일치하는지 확인하세요. 이전 genres 예시 사용:

db.movies.find( { genres: { $in: [ "News", "Talk-Show" ], $in: [ "History", "Western" ] } } )

배열 genres News Talk-Show 에 또는 와 History 또는 가 포함된 문서를 찾으려면 을 Western $in사용합니다.

db.movies.find( {
$and: [
{ genres: { $in: [ "News", "Talk-Show" ] } },
{ genres: { $in: [ "History", "Western" ] } }
]},
{ title: 1, genres: 1, year: 1 }
)

필드 배열( 예:)이고 directors: [ "Jack Conway", "Howard Hawks", "William A. Wellman" ] 문서 하나가 아닌 여러 값이 포함되어 있는지 확인하려면 를 $all 사용합니다.

db.movies.find( { directors: { $all: ['John Murray Anderson','Pèl Fejès'] } }, { title: 1, directors: 1, year: 1 })

이전 쿼리는 의미상으로 AND와 동일하지만, $all은 배열 필드를 쿼리할 때 더 명확합니다.

중복 필드 이름과 마찬가지로 쿼리에서 중복 연산자를 사용할 때도 동일한 점을 고려해야 합니다.

돌아가기

논리

이 페이지의 내용