2016-10-18 4 views
0

에 대한 최신 값 나는이 같은 모음 :MongoDB를 : 모든 필드

{ 
    _id : 1, 
    key : "one", 
    date : ISODate("2016-10-18 08:00.000"), 
    a : "a1", 
    b : "b1" 
}, 
{ 
    _id : 2, 
    key : "two", 
    date : ISODate("2016-10-18 09:00.000"), 
    a : "a2", 
    b : "b2" 
}, 
{ 
    _id : 3, 
    key : "one", 
    date : ISODate("2016-10-18 10:00.000"), 
    b : "b3", 
    c : "c3" 
}, 
{ 
    _id : 4, 
    key : "one", 
    date : ISODate("2016-10-18 11:00.000"), 
    b : "b4" 
} 

내가 모든 필드에 반환하는 하나의 프로 시저를 실행하고 싶습니다 (현장 date 기준)의 최신 값, 내가 aggregate 많은 match, sort, group하지만과를 사용하여 시도

{ 
    _id : "one", 
    a : "a1", 
    b : "b4", 
    c : "c3" 
}, 
{ 
    _id : "two", 
    a : "a2", 
    b : "b2" 
} 

: 그래서 이전의 수집을 위해 나는이 결과를받을 것이다 최신 값이 group 단계 이후의 새로운 배열의 첫 번째 요소가 될 것입니다, 그래서 성공에서 ... 당신이해야 할 일은

+0

예상 결과가 정확합니까? – NEER

+0

@NEER, 죄송합니다, 예상 된 결과가 잘못되었습니다. 지금 바로 고치겠습니다. 고맙습니다. – Michele

+0

'key'값으로 그룹화 하시겠습니까? 투영 된 필드는 동적입니까? 또는 항상 동일 할 것인가? – TomG

답변

3

date 다음 group$push 값에 의해 sort 문서입니다. 그 다음에 $project 단계에서 최신 값을 표시하려면 $arrayElemAt을 사용하십시오. 배열이 비어있는 경우 (예 : key: two), 값은 예상 한 결과로 투영되지 않습니다. 예를 들어 다음과 같이 표시됩니다.

db.test.aggregate([ 
    { 
     $sort: { 
      date: -1 
     } 
    }, 
    { 
     $group: { 
      _id: '$key', 
      a: {$push: '$a'}, 
      b: {$push: '$b'}, 
      c: {$push: '$c'} 
     } 
    }, 
    { 
     $project: { 
      a: {$arrayElemAt: ['$a', 0]}, 
      b: {$arrayElemAt: ['$b', 0]}, 
      c: {$arrayElemAt: ['$c', 0]} 
     } 
    } 
]) 

유일한 해결책은 필드 이름을 알고 있어야한다는 것입니다. 사용 가능한 모든 필드에서이를 수행하는 "일반"집계를 수행 할 수 없습니다. 가능한 필드를 알고 있다면 문제가되지 않습니다. mongoose 또는 비슷한 것을 사용하는 경우 aggregate 함수를 호출하기 전에 javascript을 사용하여 $group$project 단계를 구현하려면 schema을 사용할 수 있습니다.

+0

당신의 솔루션을 사용했고 작동했습니다! – Michele

+0

@Michele에게 감사드립니다. :) – TomG

+0

@ 톰그, 나는 조금 기다렸다가 다른 누군가가 대답하기를 기다렸다. .. 그러나 당신은 승리한다 :) – Michele