AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

$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 } ]
}

프로젝션 $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 },
],
athletics: [ "swimming", "basketball", "football" ]
},
{
_id: 3,
zipcode: "63109",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
],
athletics: [ "baseball", "basketball", "soccer" ]
},
{
_id: 4,
zipcode: "63109",
students: [
{ name: "barney", school: 102, age: 7 },
{ name: "ruth", school: 102, age: 16 },
]
}

다음 C# 클래스를 사용하여 이러한 문서를 모델로 만들 수 있습니다.

public class School
{
public string Id { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
public Student[] Students { get; set; }
public string[] Athletics { get; set; }
}
public class Student
{
public string Id { get; set; }
public string Name { get; set; }
public int School { get; set; }
public int Age { get; set; }
}

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

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

.NET/ C# 운전자 사용할 때 $elemMatch 프로젝션 수행하려면 프로젝션 빌더에서 ElemMatch() 메서드를 호출합니다. 프로젝트 에 배열 필드 의 이름을 전달하고 배열 요소에 적용 할 필터하다 전달합니다.

다음 코드 예시는 Zipcode 필드의 값이 "63109"인 모든 문서를 찾습니다. 일치하는 각 문서에 대해 프로젝션은 다음 필드를 반환합니다.

  • Id

  • 중첩된 School 필드 의 값이 102Students 배열 의 첫 번째 요소

var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
field: school => school.Students,
filter: student => student.School == 102
)
).ToList();

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

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

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

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

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

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

다음 코드 예시는 Zipcode 필드의 값이 "63109"인 모든 문서를 찾습니다. 일치하는 각 문서에 대해 프로젝션은 다음 필드를 반환합니다.

  • Id

  • Students 배열의 첫 번째 요소로, 중첩된 School 필드의 값이 102이고 Age 필드의 값이 10보다 큰 요소입니다.

var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
field: school => school.Students,
filter: student => (student.School == 102) && (student.Age > 10)
)
).ToList();

이 작업은 zipcode 값이 "63109"인 세 개의 문서를 반환합니다.

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

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

에 대한 인수는 가 프로젝션하는 배열 의 $elemMatch 요소와 $elemMatch 일치합니다. 필드 이름이 있는 동등성을 로 $elemMatch 지정하면 배열 내의 객체를 일치시키려고 시도합니다. 예시 를 들어 는 프로젝션 에서 다음에$elemMatch 대해 배열 내에서 스칼라 값 대신 객체를 일치시키려고 시도합니다.

db.schools.find( { zipcode: "63109" },
{ athletics: { $elemMatch: { athletics: "basketball" } } })
var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
"athletics",
Builders<School>.Filter.Eq("athletics", "basketball"))
).ToList();

앞의 예에서는 zipcode 값이 "63109"인 문서를 반환하지만 프로젝션 작업에서 일치하는 요소를 찾지 못했기 때문에 이러한 문서에는 _id 필드 만 포함됩니다.

스칼라 값을 일치시키려면 일치시키려는 스칼라 값({$eq: <scalar value>})과 함께 등호 연산자 를 사용합니다. 예를 예시, 다음 find() 작업은 zipcode 필드 값이 "63109" 인 모든 문서를 쿼리합니다. 프로젝션 에는 값이 basketballathletics 배열 의 일치하는 요소가 포함됩니다.

db.schools.find( { zipcode: "63109" },
{ athletics: { $elemMatch: { $eq: "basketball" } } })

.NET/C# 드라이버를 사용할 때 배열의 스칼라 값에 대해 $elemMatch 작업을 수행하려면 프로젝션 빌더에서 ElemMatch() 메서드를 호출합니다. 프로젝트할 배열 필드의 이름과 필드 "$eq" 및 비교할 값에 대한 동등 필터를 전달합니다.

var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
field: "athletics",
filter: Builders<School>.Filter.Eq("$eq", "basketball"))
).ToList();

이 작업은 zipcode 값이 "63109"인 세 개의 문서를 반환합니다. 반환된 문서에는 _id 필드와 athletics 배열의 일치하는 요소가 포함되어 있습니다(있는 경우).

[
{ _id: 1 },
{ _id: 3, athletics: [ 'basketball' ] },
{ _id: 4 }
]

가 인 _id 3 $elemMatch 문서 가 기준과 일치하는 유일한 문서 입니다.

$ (projection) 연산자

이 페이지 평가하기

이 페이지의 내용