배열의 요소를 일치 : ""있는하여 MongoDB의 집계 프레임 워크 : 프로젝트는 내가 같은 "클래스"문서가
{
className: "AAA",
students: [
{name:"An", age:"13"},
{name:"Hao", age:"13"},
{name:"John", age:"14"},
{name:"Hung", age:"12"}
]
}
을 그리고 내가 이름을 가진 학생을 얻으려면, 단지에서 요소를 일치 수 배열 "학생". 나는 같은 기능 발견()로이 작업을 수행 할 수 있습니다
>db.class.find({"students.name":"An"}, {"students.$":true})
{
"_id" : ObjectId("548b01815a06570735b946c1"),
"students" : [
{
"name" : "An",
"age" : "13"
}
]}
그것은 괜찮지 만 다음과 같은 난 집계와 동일한 작업을 수행 할 때, 그것은 오류 얻을 :
db.class.aggregate([
{$match:{"students.name":'An'}},
{$project:{"students.$":true}}
])
오류는 다음과 같습니다
uncaught exception: aggregate failed: {
"errmsg" : "exception: FieldPath field names may not start with '$'.",
"code" : 16410,
"ok" : 0
}
을
왜? aggregate()의 $ 프로젝트 연산자에서 배열에 "$"를 사용할 수 없지만 find()의 프로젝트 연산자에서이 연산자를 사용할 수 있습니다.
나는 그것을 시도했지만, 나는이 해결책이 좋지 않다고 생각한다. $ unwind를 사용하면 문서가 너무 많은 시간 (배열의 요소 수만큼) 복제되어 성능에 영향을 미칠 수 있습니다. – Deka
그건 의미가 있습니다. 그렇게 할 수있는 방법은 파이프 라인에서 풀림과 일치 순서를 전환하여 문서를 먼저 필터링 한 다음 푸는 것이 쉽도록 푸는 것입니다. 업데이트 된 답변을 참조하십시오. – atyagi
그것은 수용할만한 해결책이 될 것입니다, 나는 단지 "왜"나는 $ ("$"를 집계()의 $ 프로젝트 연산자로 사용할 수있는 반면, find()의 프로젝트 연산자에서는 이것을 사용할 수는 없다 "라고 말합니다. – Deka