2014-12-02 1 views
1

masterID 또는 으로 그룹화해야하는 객체 모음이 있습니다 (masterID이없는 경우). masterID이 같은 객체 그룹 중 가장 높은 것()을 찾아야합니다. ($max: "$pos"). 그러나, 나는 pos이 최대화 된 완전한 객체를 얻기 위해 애를 쓴다. 집합체를 통해 pos 속성 만 얻을 수 있지만 전체 객체는 얻을 수 없다. 여기에 부족한 내가 사용하는 샘플 집계가있는 $ifNullmasterID을 위해 : Sample 객체가 될

> db.tst.aggregate([{ "$group": { "_id": "$masterID", "pos": { "$max": "$pos" } } }]) 

:

> db.tst.find() 
{ "_id" : ObjectId("547d6bd28e47d05a9a492e2e"), "masterID" : "master", "pos" : "453", "id" : "hallo" } 
{ "_id" : ObjectId("547d6bda8e47d05a9a492e2f"), "masterID" : "master", "pos" : "147", "id" : "welt" } 
{ "_id" : ObjectId("547d6be68e47d05a9a492e30"), "masterID" : "master2", "pos" : "1", "id" : "welt" } 

원하는 집계 결과는 다음과 같습니다

{ "_id" : ObjectId("547d6bd28e47d05a9a492e2e"), "masterID" : "master", "pos" : "453", "id" : "hallo" } 
{ "_id" : ObjectId("547d6be68e47d05a9a492e30"), "masterID" : "master2", "pos" : "1", "id" : "welt" } 

방법이 있나요 집계를 통해이 결과를 얻거나 그룹화 된 모든 개체를 얻고에서 최대화를 구현하려면 $push을 사용해야합니까?은 Java 코드에서 집계 주위에 있습니까?

이 질문에 mongodb aggregation: How to return a the object with min/max instead of the value$first 또는 $lastpos으로 분류 개체에 사용하는 것을 나타낸다,하지만 난 그게 전체 개체를 반환하는 방법을 참조하지 못한다. 내가 바로 이해 한 경우

답변

4

시작을 pos 내림차순으로 정렬하여. 그러면 각 masterID에 대한 첫 번째 문서가 가장 높은 문서 인 pos이됩니다. $$ROOT을 사용하여 현재 파이프 라인에서 처리중인 전체 문서를 참조 할 수 있습니다.

+0

'$$ ROOT'을 이해하지 못합니다. '$$ ROOT'에는'$ sort' 이후에 전체 문서가 있습니까? 이런 식으로 당신은 목표물을 할 수 있습니까? – Barno

+0

'$$ ROOT'는 현재 파이프 라인에서 처리중인 문서를 참조합니다. [http://docs.mongodb.org/manual/reference/aggregation-variables/#variable.ROOT](http://docs.mongodb.org/manual/reference/aggregation-variables/#variable.ROOT)를 참조하십시오. – wdberkeley

1

, 당신이 시도 할 수 :

db.tst.aggregate([ 
    { "$sort" : { "pos" : -1 } }, 
    { 
    "$group": { 
     "_id": { $ifNull: [ "$masterID", "$id" ] },  
      "_Tempid":{$first:"$_id"}, 
      "masterID":{$first:{ $ifNull: [ "$masterID", "$id" ] }}, 
      "pos": { "$max": "$pos" }, 
      "id" : {$first:"$id"} 

     } 
    },{ 
     $project:{ 
      _id:"$_Tempid", 
      "masterID":1, 
      "pos":1, 
      id:1 
     } 
    } 

]) 

결과 :

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("547d6be68e47d05a9a492e30"), 
      "masterID" : "master2", 
      "pos" : "1", 
      "id" : "welt" 
     }, 
     { 
      "_id" : ObjectId("547d6bd28e47d05a9a492e2e"), 
      "masterID" : "master", 
      "pos" : "453", 
      "id" : "hallo" 
     } 
    ], 
    "ok" : 1 
} 
+0

'우선 순위'로 정렬해야합니다. 그렇지 않으면 '$ first'값이 올 문서는 자연 순서대로 그룹의 첫 번째 문서가됩니다. – wdberkeley

+0

@wdberkeley nice, thank you – Barno