$elemMatch (쿼리)
정의
$elemMatch
$elemMatch
연산자는 지정된 모든 쿼리 조건과 일치하는 요소가 하나 이상 있는 배열 필드가 포함된 문서를 일치시킵니다.
호환성
다음 환경에서 호스팅되는 배포에 $elemMatch
사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
행동
$elemMatch
에는$where
연산자를 지정할 수 없습니다.$elemMatch
에서$text
쿼리 연산자를 지정할 수 없습니다.
예시
요소 매칭
scores
에 다음 문서가 주어집니다
{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] }
다음 쿼리는 results
배열에 80
보다 크거나 같고 85
보다 작은 요소가 하나 이상 포함된 문서만 일치합니다.
db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } )
82
요소가 80
보다 크거나 같고 85
보다 작으므로 쿼리는 다음 문서를 반환합니다.
{ "_id" : 1, "results" : [ 82, 85, 88 ] }
배열 요소에 여러 조건을 지정하는 방법에 대한 자세한 내용은배열 요소에 여러 조건 지정을 참조하세요.
내장된 문서 배열
이 문은 survey
컬렉션에 문서를 삽입합니다:
db.survey.insertMany( [ { "_id": 1, "results": [ { "product": "abc", "score": 10 }, { "product": "xyz", "score": 5 } ] }, { "_id": 2, "results": [ { "product": "abc", "score": 8 }, { "product": "xyz", "score": 7 } ] }, { "_id": 3, "results": [ { "product": "abc", "score": 7 }, { "product": "xyz", "score": 8 } ] }, { "_id": 4, "results": [ { "product": "abc", "score": 7 }, { "product": "def", "score": 8 } ] }, { "_id": 5, "results": { "product": "xyz", "score": 7 } } ] )
5
의 _id
가 있는 문서에 배열이 포함되어 있지 않습니다. 이 문서는 $elemMatch
가 배열 요소와만 일치한다는 것을 보여주기 위해 포함되었으며, 다음 예시에서 볼 수 있습니다.
다음 쿼리는 results
이 적어도 하나의 요소를 포함하고, 그 요소에서 product
이 "xyz"
이며 score
이 8
이상인 문서와 일치합니다.
db.survey.find( { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } } )
구체적으로 쿼리는 다음 문서와 일치합니다.
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
단일 쿼리 조건
다음 섹션에서는 단일 쿼리 조건에 $elemMatch
를 사용하고 $elemMatch
를 생략할 때의 출력 차이점을 보여 줍니다.
예시 1
$elemMatch
를 사용한 쿼리:
db.survey.find( { results: { $elemMatch: { product: "xyz" } } } )
쿼리는 results
의 product
가 "xyz"
인 문서를 반환합니다.
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] } ]
$elemMatch
없는 쿼리:
db.survey.find( { "results.product": "xyz" } )
다음 출력에서는 _id
가 5
인 문서(배열을 포함하지 않음)도 포함되어 있습니다.
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] }, { _id: 5, results: { product: 'xyz', score: 7 } } ]
예시 2
다음 쿼리를 고려해보세요.
첫 번째 쿼리에는
$elemMatch
에 단일<query>
조건이 있습니다.두 번째 쿼리는
$elemMatch
를 생략합니다.
$elemMatch
를 사용한 첫 번째 쿼리:
db.survey.find( { "results": { $elemMatch: { product: { $ne: "xyz" } } } } )
쿼리는 "xyz"
이외의 값을 가진 product
가 있는 문서를 반환합니다.
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] } { "_id" : 2, "results" : [ { "product" : "abc", "score" : 8 }, { "product" : "xyz", "score" : 7 } ] } { "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] } { "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
$elemMatch
를 사용하지 않는 두 번째 쿼리:
db.survey.find( { "results.product": { $ne: "xyz" } } )
쿼리는 product
results
중 "xyz"
가 없는 문서를 반환합니다.
{ "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
두 쿼리 모두 _id
가 4
인 문서를 포함하고, product
가 "xyz"
이므로 _id
가 5
인 문서를 생략합니다.
자세히 알아보기
배열 쿼리에 대한 추가 예시는 다음을 참조하세요.
쿼리에 대한 추가 예는 쿼리 문서를 참조하세요.