2017-10-16 4 views
0

나는 비슷한 질문을 보았지만 나 자신과 같은 초보자에게는 복잡했다. 또한 응답을 구문 분석을 제공하는 아무도.프로젝트 및 슬라이스를 사용한 집계, mongodb

내 데이터베이스 :

name :"Kim" 
    points: [ 
     { category:"Purchase", 
     points: -50}, 
     { category: "Wage", 
     points : 275}, 
     { category: "Purchase", 
     points: -40} 
    ] 

    name :"Meghan" 
    points: [ 
     { category:"Contest", 
     points: 130}, 
     { category: "Purchase", 
     points : -25}, 
     { category: "Games", 
     points : 50} 
    ] 
    ] 

는 그래서 몽고 쉘에서 나는 "구매"를 동일하지만 마지막 날에 돌아가 모든 points.category을 찾을 얻기 위해 노력하고있어. 필자는 aggregate, $ project 및 $ slice를 사용하여이 작업을 시도했습니다. 내 문제는 $ slice가 $ project 또는 쉼표로 구분 된 외부에 있는지 여부를 알 수있는 구문을 잘 이해하지 못한다는 것입니다. 필자가 $ project를 단독으로 사용하거나 $ slice를 사용할 때 구문을 이해하지만 이러한 모든 것을 함께 사용하여 마술처럼 사용하는 방법에 대한 단서가 없습니다. 누군가 내 문제를 해결하고 이러한 모든 것을 적절하게 결합하는 방법을 설명 할 수 있다면 영원히 빚을지게 될 것입니다. 나는 문서를 읽었지만, 모든 것을 다 사용하는 방법을 보여주지 못했습니다.

마지막으로 구입 한 제품을 찾으려면 이름이 김 (Kim) 인 학생을 검색하고 싶습니다. 내가 원하는 결과는 [{points : -40}]

+0

누락 된 부분은' "구매를 위해 ['$ filter'] (https://docs.mongodb.com/manual/reference/operator/aggregation/filter/) 배열의 내용이 필요하다 "''** 먼저 ** 전에 $ 슬라이스를 적용하거나 ['$ arrayElemAt'] (https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/)을 사용하여 * * 마지막 ** 요소. 그래서'$ filter'는 그 원소들을 가진 배열을 반환합니다. 그 명령문을'$ slice'와'-1' 인덱스로 감싸는 것은 "filtered"배열의 "last"를 반환합니다. –

+0

링크 된 문서 외에'$ filter' 사용법과 같은 [MongoDB 컬렉션의 객체 배열에서 쿼리 된 요소 만 검색] (https://stackoverflow.com/q/3985214/2313887)을 참조하십시오. –

+0

좋아, 이걸 생각해 냈어 : db.students.aggregate ([{$ project : {points : {$ filter : {input : "$ points", as : "pts", cond : {$ eq : [ "$ $ pts.category ","Purchase "]}}}}}). pretty()'문제는 모든 학생의 구매를 반환한다는 것입니다. 어떻게하면 그냥 kims를 돌려 주며, 어디에서 마지막 구매 만 할 수 있도록 슬라이스를 놓을 수 있습니까? –

답변

0

다른 집계 연산자와 함께 더 많은 프로젝션을 사용할 수 있다면 이것을 시도 할 수 있습니다.

db.students.aggregate([ 
{ $match : { name : "Kim" } }, 
{ $project: 
    { 
     points: { 
      $filter : { input: "$points", as:"pts", cond: {$eq: ["$$pts.category", "Purchase"]} } 
      } 
    } 
}, 
{ $project: 
    { 
     _id : 0, 
     points: { $arrayElemAt: [{$slice: [ "$points.points", -1]},0] } 
    } 
} 
]) 
+0

Hydro 덕분에 두 번째 투영이 아니라 코드 상단 부분 만 사용 했으므로 완벽하게 작동했습니다. 모든 도움을 주신 모든 분들께 감사드립니다. –

+0

첫 번째 예상은 "모든 구매 점수"를, 두 번째 예측은 "마지막 구매 점수"를 나타냅니다. –