2014-12-05 47 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