문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

$elemMatch (projection)

이 페이지의 내용

  • 정의
  • 사용 고려 사항
  • 예제

다음도 참조하세요.

$elemMatch (쿼리)

$elemMatch

$elemMatch 연산자는 <array> 조건과 일치하는 $elemMatch 첫 번째 요소만 포함하도록 쿼리 결과에서 필드의 내용을 제한합니다.

$ 연산자와 $elemMatch 연산자는 모두 조건에 따라 배열에서 일치하는 첫 번째 요소를 프로젝션합니다.

$ 연산자는 query문의 일부 조건을 기반으로 컬렉션의 각 문서에서 첫 번째로 일치하는 배열 요소를 프로젝트합니다.

$elemMatch 프로젝션 연산자는 명시적 조건 인수를 받습니다. 이를 통해 쿼리에 없는 조건을 기반으로 프로젝트하거나 배열에 내장된 문서의 여러 필드를 기반으로 프로젝트해야 하는 경우 프로젝트할 수 있습니다. 예제는 배열 필드 제한 을 참조하세요.

문서에 있는 필드의 순서에 관계없이 기존 필드의 $elemMatch 프로젝션은 다른 기존 필드 포함 뒤에 필드를 반환합니다.

예를 들어 players 다음 문서가 있는 컬렉션을 생각해 보겠습니다.

db.players.insertOne( {
name: "player1",
games: [ { game: "abc", score: 8 }, { game: "xyz", score: 5 } ],
joined: new Date("2020-01-01"),
lastLogin: new Date("2020-05-01")
} )

다음 프로젝션은 문서에서 필드가 joinedlastLogin 필드 앞에 나열되어 있더라도 프로젝션에 포함된 다른 기존 필드 뒤에 games 필드를 반환합니다.

db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )

즉, 이 작업은 다음 문서를 반환합니다.

{
"_id" : ObjectId("5edef64a1c099fff6b033977"),
"joined" : ISODate("2020-01-01T00:00:00Z"),
"lastLogin" : ISODate("2020-05-01T00:00:00Z"),
"games" : [ { "game" : "abc", "score" : 8 } ]
}

버전 4.2 이하에서는 기존 필드의 $elemMatch 프로젝션이 문서의 순서를 유지합니다.

{
"_id" : ObjectId("5edef91e76ddff7d92f118e1"),
"games" : [ { "game" : "abc", "score" : 8 } ],
"joined" : ISODate("2020-01-01T00:00:00Z"),
"lastLogin" : ISODate("2020-05-01T00:00:00Z")
}
  • db.collection.find() 뷰 에 대한 작업은 프로젝션 연산자를 지원하지 $elemMatch 않습니다.

  • $elemMatch에는 $text 쿼리 표현식을 지정할 수 없습니다

$elemMatch 프로젝션 연산자에 대한 예제에서는 다음 문서가 포함된 schools 컬렉션을 가정합니다.

{
_id: 1,
zipcode: "63109",
students: [
{ name: "john", school: 102, age: 10 },
{ name: "jess", school: 102, age: 11 },
{ name: "jeff", school: 108, age: 15 }
]
}
{
_id: 2,
zipcode: "63110",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 3,
zipcode: "63109",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 4,
zipcode: "63109",
students: [
{ name: "barney", school: 102, age: 7 },
{ name: "ruth", school: 102, age: 16 },
]
}

다음 find() 작업은 zipcode 필드의 값이 63109 인 모든 문서를 쿼리합니다. $elemMatch 프로젝션은 school 필드 값이 102students 배열의 첫 번째 일치 요소만 반환합니다.

db.schools.find( { zipcode: "63109" },
{ students: { $elemMatch: { school: 102 } } } )

이 작업은 zipcode63109 인 다음 문서를 반환하고 $elemMatch을 사용하여 students 배열을 프로젝션합니다.

{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
{ "_id" : 3 }
{ "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
  • _id1 인 문서의 경우 students 배열에는 school 필드가 102 인 여러 요소가 포함되어 있습니다. 그러나 $elemMatch 프로젝션은 배열에서 일치하는 첫 번째 요소만 반환합니다.

  • _id3 인 문서는 students 배열의 $elemMatch 조건과 일치하는 요소가 없기 때문에 결과에 students 필드를 포함하지 않습니다.

$elemMatch 프로젝션은 여러 필드에 대한 기준을 지정할 수 있습니다.

find() 작업은 zipcode 필드의 값이 63109있는 모든 문서를 쿼리합니다. 프로젝션은 school 필드의 값이 102이고 age 필드가 10보다 큰 students 배열의 첫 번째 일치하는 요소가 포함됩니다.

db.schools.find( { zipcode: "63109" },
{ students: { $elemMatch: { school: 102, age: { $gt: 10} } } } )

이 작업은 zipcode63109인 세 개의 문서를 반환합니다.

{ "_id" : 1, "students" : [ { "name" : "jess", "school" : 102, "age" : 11 } ] }
{ "_id" : 3 }
{ "_id" : 4, "students" : [ { "name" : "ruth", "school" : 102, "age" : 16 } ] }

_id3 인 문서에는 $elemMatch 기준과 일치하는 배열 요소가 없기 때문에 students 필드가 포함되어 있지 않습니다.

다음도 참조하세요.

$ (projection) 연산자

← $ (projection)

이 페이지의 내용