1

고려할 때 해당 문서 제한 :MongoDB를 그룹 문서와 각 그룹

{ 
    "Field1":"Test_1", 
    "Speaker":1, 
    "Listener":2, 
    "ListenTime": ISODate("2016-10-15T14:17:49.336Z") 
}, 
{ 
    "Field1":"Test_2", 
    "Speaker":1, 
    "Listener":2, 
    "ListenTime": ISODate("2016-10-13T14:17:49.336Z") 
}, 
{ 
    "Field1":"Test_3", 
    "Speaker":1, 
    "Listener":3, 
    "ListenTime": ISODate("2016-10-10T14:10:49.336Z") 
} 

무엇 내가 무엇을 할 수있는 것은 MongoDB를 단일 쿼리 (3.2)를 추출하는 것입니다 스피커와 청취자별로 그룹화 문서 만 만 복용 가장 오래된 ListenTime을 가진 문서.
그래서,이 경우, 결과는 다음과 같습니다

{ 
    "Field1":"Test_1", 
    "Speaker":1, 
    "Listener":2, 
    "ListenTime": ISODate("2016-10-15T14:17:49.336Z") 
}, 
{ 
    "Field1":"Test_3", 
    "Speaker":1, 
    "Listener":3, 
    "ListenTime": ISODate("2016-10-10T14:10:49.336Z") 
} 

이 가능 단일 쿼리로 그렇게되어 있습니까?

+0

무엇을 게시하세요 너 지금까지 해봤 니? –

답변

1

을 실행하여 원하는 결과를 얻을 수있는 다음과 같은 통합 파이프 라인 :

db.collection.aggregate([ 
    { "$sort": { "ListenTime": -1 } }, 
    { 
     "$group": { 
      "_id": { 
       "Speaker": "$Speaker", 
       "Listener": "$Listener" 
      }, 
      "Field1" : { "$first": "$Field1" }, 
      "ListenTime" : { "$first": "$ListenTime" } 
     } 
    }, 
    { 
     "$project": { 
      "Field1": 1, 
      "Speaker": "$_id.Speaker", 
      "Listener": "$_id.Listener", 
      "ListenTime": 1, 
      "_id": 0 
     } 
    } 
]) 

샘플 출력은

/* 1 */ 
{ 
    "Field1" : "Test_3", 
    "ListenTime" : ISODate("2016-10-10T14:10:49.336Z"), 
    "Speaker" : 1, 
    "Listener" : 3 
} 

/* 2 */ 
{ 
    "Field1" : "Test_1", 
    "ListenTime" : ISODate("2016-10-15T14:17:49.336Z"), 
    "Speaker" : 1, 
    "Listener" : 2 
} 
1

이것을 달성하기 위해 집계 프레임 워크를 사용할 수 있습니다. 첫 번째 단계에서는 $group을 사용하여 스피커 및 수신기로 문서를 그룹화합니다. 이 단계에서는 $push 연산자를 사용하여 그룹의 모든 문서를 목록에 추가하고 $max 연산자를 사용하여 최근 ListenTime을 계산합니다. 목록의 최근 ListenTime으로 문서를 유지하려면 $redact 단계를 따릅니다. 그런 다음 $unwind 단계를 사용하여 목록을 문서로 병합합니다. 그런 다음 원하는 필드를 얻으려면 최종 $project 단계를 사용하십시오.

집계 쿼리는 다음과 같습니다.

db.sampleCollection.aggregate([ 
    { 
     "$group":{ 
      "_id":{"Speaker":"$Speaker", "Listener":"$Listener"}, 
      ListenTime : {"$max":"$ListenTime"}, 
      "docs":{"$push":"$$ROOT"} 
     } 
    }, 
    { 
     $redact:{ 
      $cond:[{$eq:["$ListenTime","$$ROOT.ListenTime"]},"$$DESCEND","$$PRUNE"] 
     } 
    }, 

    { 
     "$project":{ 
      "ListenTime":1, 
      "Field1":"$docs.0.Field1", 
      "Speaker":"$docs.0.Speaker", 
      "Listener":"$docs.0.Listener" 
     } 
    } 
]) 

샘플 출력 :

{ 
     "ListenTime" : ISODate("2016-10-10T14:10:49.336Z"), 
     "Field1" : "Test_3", 
     "Speaker" : 1, 
     "Listener" : 3 
} 
{ 
     "ListenTime" : ISODate("2016-10-15T14:17:49.336Z"), 
     "Field1" : "Test_1", 
     "Speaker" : 1, 
     "Listener" : 2 
}