Docs Menu
Docs Home
/
데이터베이스 매뉴얼
/ / / /

$and

$and

$and하나 이상의 표현식(<expression1>, <expression2> 등)으로 구성된 배열에서 논리적 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)을 포함한 대부분의 프로그래밍 언어와 드라이버는 동일한 객체 수준에서 중복 키를 가진 객체 생성을 허용하지 않습니다. 예를 들어 다음 쿼리를 고려해 보세요.

db.inventory.find( { price: { $in: [ 7.99, 3.99 ], $in: [ 4.99, 1.99 ] } } )

위 쿼리는 필드 이름 price가 동일 객체 수준에서 중복된 연산자를 갖고 있기 때문에 정확하게 작성되지 않습니다. 그 결과 서버로 전송된 쿼리는 의도한 것과 다릅니다. 쿼리가 예상대로 작동하게 하려면 명시적으로 AND 연산자를 사용하세요.

db.inventory.find( {
$and: [
{ price: { $in: [ 7.99, 3.99 ] } },
{ price: { $in: [ 4.99, 1.99 ] } }
]
} )

이 쿼리는 두 조건이 모두 만족되는지 명확하게 확인합니다. 즉, price 배열에는 각각의 $in 집합에서 최소한 하나 이상의 값이 포함되어야 합니다. 이러한 시나리오를 해결하는 방법에 대한 추가 정보는예시 섹션을 참고하세요.

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

db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )

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

  • price 필드 값이 1.99과(와) 같지 않으며,

  • 필드에 price이(가) 존재합니다.

price 필드에 대한 연산자 표현식을 중첩된 암시적 AND가 포함된 하나의 쿼리 객체로 결합해 쿼리를 더 간단하게 만들 수 있습니다.

db.inventory.find( { price: { $ne: 1.99, $exists: true } } )

동일한 필드에서 중복된 조건을 처리할 때, 이러한 재작성이 불가능한 경우가 종종 있습니다. 예시는 다음과 같습니다.

db.inventory.find( { status: { $ne: "closed", $ne: "archived" } } )

위의 쿼리는 동일한 객체 수준에서 동일한 status 필드 이름에 $ne 연산자를 여러 번 사용하기 때문에 올바르게 구성되지 않습니다. 이 경우 $nin 연산자가 더 효과적인 해결책을 제공합니다.

db.inventory.find( { status: { $nin: [ "closed", "archived" ] } } )

쿼리를 다시 작성하는 방법은 사용 사례의 의도된 의미에 따라 달라집니다. 다음 쿼리를 생각해 보세요.

db.inventory.find( {
$and: [
{ status: "new" },
{ status: "processing" }
]
} )

statusnew 또는 processing인 문서를 찾으려면 $in 연산자를 사용할 수 있습니다.

db.inventory.find( { status: { $in: [ "new", "processing" ] } } )

status 필드가 배열 [ "new", "processing" ]인 경우 문서에 newprocessing 값이 모두 포함되어 있는지 확인하려면 $all 연산자를 사용합니다.

db.inventory.find( { status: { $all: [ "new", "processing" ] } } )

이 맥락에서 이 쿼리는 AND와 의미적으로 동일하지만, 배열 필드를 쿼리할 때는 $all이 더 명확한 경우가 많습니다.

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

돌아가기

논리

이 페이지의 내용