$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
로 평가되더라도 오류를 일으킬 수 있습니다.
예를 들어, 다음 쿼리는 $x
이 0
인 경우 항상 오류를 생성합니다.
db.example.find( { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } )
$and
에 제공된 여러 표현식이 포함된 다음 쿼리에서 $x
이 0
인 문서가 있는 경우 오류가 발생할 수 있습니다.
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
즉, 배열 각 설정하다 에서 하나 이상의 값을 포함해야 합니다. 이러한 시나리오를 주소 방법에 대한 자세한 내용은 예제 섹션을 참조하세요.
예시
동일한 필드에 여러 표현식을 지정한 $and 쿼리
다음 쿼리를 고려해보세요.
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" } } )
위의 쿼리 동일한 객체 수준의 동일한 필드 이름에 $ne
연산자 두 번 이상 사용하기 때문에 올바르게 구성되지 status
않습니다. 이 경우 $nin
연산자 보다 효과적인 솔루션을 제공합니다.
db.inventory.find( { status: { $nin: [ "closed", "archived" ] } } )
쿼리 다시 작성하는 방법은 사용 사례 의 의도된 시맨틱에 따라 달라집니다. 다음 쿼리 고려하세요.
db.inventory.find( { $and: [ { status: "new" }, { status: "processing" } ] } )
가 또는 인 status
new
processing
$in
문서를 찾으려면 연산자 사용할 수 있습니다.
db.inventory.find( { status: { $in: [ "new", "processing" ] } } )
status
[ "new", "processing" ]
필드 가 배열 이고 문서 및 new
processing
값이 모두 포함되어 $all
있는지 확인하려면 연산자 사용합니다.
db.inventory.find( { status: { $all: [ "new", "processing" ] } } )
이러한 맥락에서 이 쿼리 의미상 와 AND
동일하지만 배열 필드를 쿼리할 때 가 더 명확한 경우가 $all
많습니다.
중복 필드 이름과 마찬가지로 쿼리 에 사용되는 중복 연산자에도 동일한 고려 사항이 적용 .