2014-12-05 3 views
2

MongoDB에서 먼저 ID로 그룹화 한 다음 내림차순으로 정렬하려고합니다. 여기 기능 LINQ 표현이 있습니다MongoDB 집계 및 GroupBy 이해

var list = this.GetPackages().ToList(); 
     list = list.OrderByDescending(package => package.PackageVersion) 
     .GroupBy(g => g.PackageId) 
     .Select(packages => packages.First()).ToList(); 
     return list; 

을하지만 동등한 MongoDB의 발현을 마련하는 것 할 수 없으며, 심지어 작동하려면 $ 프로젝트 기능을 얻을 수 있습니다 :

db.packages.aggregate([ 
    { 
     $sort : { packageVersion : -1 } 
    }, 
    { 
     $group: { _id: "$PackageId" } 
    }, 
    { 
     $project: { PackageVersion: 1, Title: 1 } 
    } 
]) 

내를

{ "_id" : "e3afb1fe-dce7-476e-8372-cd8201abc131" } 
{ "_id" : "e3722179-0903-4894-9a86-3a3ffd94de83" } 
{ "_id" : "3e65e93a-4c2c-4a02-8b21-e5858a4058dd" } 

가 올바른 형식의 MongoDB의 쿼리, 그리고 C# MongoDB의 드라이버를 사용하여이 작업을 수행하는 동등한 방법이있다 : 결과는이 무엇입니까?

+0

[]]가 누락 되었습니까? 아니면 그냥 오타입니까? 속성은 대/소문자를 구분합니다. – BatScream

+0

죄송합니다. 대괄호를 추가했지만 아무 것도 변경하지 않았습니다. 결과를 원래 게시물에 추가하겠습니다. –

+0

아래의 답변을 확인하십시오. db.packages.aggregate ([ { $ 정렬 : {PackageVersion : -1} }, { $ 그룹 : {_id : "$ PackageId", "PackageVersion": {$ – BatScream

답변

2

$first 연산자와 $$ROOT 변수를 사용하여 그룹의 첫 번째 문서를 가져옵니다.

$$ROOT

그 시스템 변수이다, 즉 최상위 문서

루트 문서를 참조 현재 가 집약 파이프 라인 스테이지에서 처리된다.

그런 다음 첫 번째 문서를 투사하십시오.

db.packages.aggregate([ 
    { 
     $sort : { packageVersion : -1 } 
    }, 
    { 
     $group: { "_id": "$PackageId","firstPackage":{$first:"$$ROOT"}} 
    }, 
    { 
     $project: { "firstPackage": 1, "_id": 0} 
    } 
]) 
+0

은이 코드를 사용 첫 번째 : "$ PackageVersion"}} } ] 나는 더 가까워 지지만 모든 프로젝트를 명시 적으로 프로젝트 문에 지정하지 않고 모든 속성을 선택해야합니다. 이것이 가능한가? –

+0

예.'$$ ROOT'를 사용하여 액세스해야합니다. 그러나 키에 바인딩 된 문서를 가져올 것입니다. 업데이트 된 답변을 참조하십시오. – BatScream

+0

좋아, 그 덕분에,하지만 $$ 뿌리를 사용하여 설명 할 수 있습니까? –