2014-12-05 51 views
2

我想通過ID做MongoDB中查詢到第一組,然後降序排序。我有一個功能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 2014-12-05 00:31:22

+0

哎呀,我加了括號,但它並沒有改變任何東西。我會將結果添加到原始帖子中。 – 2014-12-05 00:32:38

+0

請檢查下面的答案。 – BatScream 2014-12-05 00:37:06

回答

2

使用$first運算符和$$ROOT變量獲取組中的第一個文檔。

$$ROOT是一個系統變量:

參考根文檔,即頂級文檔,目前 在聚集流水線階段被處理。

然後項目中第一個文件。

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

我用這個代碼: db.packages.aggregate([{ $ 排序:{PackageVersion:-1} },{ $ 組:{_id: 「$包ID」, 「PackageVersion」:{$第一:「$ PackageVersion」}}} ]) 這讓我更接近,但我仍然需要選擇所有屬性,最好是沒有一個項目明確地聲明它們命名。這可能嗎? – 2014-12-05 00:46:16

+0

是你需要使用它$$ ROOT'使用訪問。但是你會得到綁定到一個鍵的文檔。請參閱最新的答案。 – BatScream 2014-12-05 00:48:32

+0

好吧,這工作,謝謝,但你能解釋一下使用$$ ROOT呢? – 2014-12-05 00:49:59