2012-10-11 2 views
0

을 사용하는 모든 객체는 나는이그룹 통합 프레임 워크

{ "event_type": "event1", "created_at": some_date, ...more_fields... }, 
    { "event_type": "event2", "created_at": some_date, ...other_fields... }, 
    { "event_type": "event1", "created_at": some_date, ...more_fields... } 

가 지금은 존재하지 않을 수있는 몇 가지 필드로 그룹화 모든 필드 위의 데이터를 (갖고 싶어처럼 보인다하여 MongoDB에서 개체의 컬렉션을 가지고 모든 객체) 가장 높은 created_at 날짜순으로 정렬하십시오. 나는 어떤 특정 분야에 넣으면 라인

:events => { "$push" => { ... } } 

관련이 직면하고있어 문제는 다음 작동

collection.aggregate([ 
    { "$group" => { 
     :_id  => "$somefield", 
     :last_time => { "$max" => "$created_at" }, 
     :events => { "$push" => { ... } } 
     } 
    }, 
    { "$match" => { "_id" => { "$ne" => nil } } }, 
    { "$sort" => { "last_time" => -1 } } 
    ]) 

: 나는 다음과 같은 쿼리를 집계 프레임 워크를 사용하여이 작업을 수행하기 위해 노력했다 하지만 컬렉션에 포함 된 정확한 필드를 모르겠습니다. 그러나 오히려 나는 전체 개체는 다음과 같이 반환합니다 :

{ 
     "event_type": "event1", "last_time": some_date, "events": [ 
      { "event_type": "event1", "created_at": some_date, ...more_fields... }, 
      { "event_type": "event1", "created_at": some_date, ...more_fields... }, 
      ... 
     ] 
    } 

답변

0

먼저 경기를 할 경우, 당신은 인덱스를 사용 할 수 있습니다 (하나는 "somefield"에있는 경우)

을 할 수 당신은 각 집계 값에 대한 배열을 만들려는 하위 의사를 프로젝트해야합니까? 나는 이것을 테스트하지는 않았지만 희망을 갖고 올바른 방향으로 당신을 가리킬 수 있습니까?

?

db.collection.aggregate( 
{ $match : { "some_field" : { $ne:null} } }, 
{ $project : 
    { 
     event_type :"event_type", 
     created_at: "created_at", 
     event: 
     { 
      another_att: "attrib1", 
      another_att2: "attrib2" 
     } 
    }, 
{ $group : 
    { 
     _id: "$event_type", 
     lasttime : { $max: "$created_at"}, 
     theevents: { $addToSet : "$event" } 
    } 
}) 
1

그냥 그렇게 알려진 필드 부모에서 그들을 감싸고 밀어 수없는, 그 필드는 정확히 알지 못하고, 당신이 개체의 모든 필드를 밀어하려는 가정?

{ events: { 
    "event_type": "event1", "created_at": some_date, ...more_fields... 
    } 
}, 

"이벤트"를 눌러야합니다.

options = { 
    key:  "field_to_group_by", 
    cond:  { ..some filter criteria.. }, 
    initial: { :events => [] }, 
    reduce: "function(obj, agg) { agg.events.push(obj); }" 
} 
collection.group(options) 

이 내가 원하는 순서대로 항목을 반환하지 않습니다,하지만 정렬이 클라이언트에서 수행 할 수 있습니다

+0

그럴 수는 있지만 데이터의 모양을 변경하지 않아도됩니다. 나는 간단한 그룹 호출과 클라이언트로 정렬하여 끝내었다. – derfred

0

이 문제는 그룹 기능을 사용하여보다 쉽게 ​​해결된다.

+0

그냥 group()에 .Sort()를 추가 할 수 없습니까? – cirrus

관련 문제