【问题标题】:Understanding MongoDB Aggregate and GroupBy了解 MongoDB 聚合和 GroupBy
【发布时间】:2014-12-05 00:25:50
【问题描述】:

我正在尝试在 MongoDB 中进行查询,以首先按 id 分组,然后降序排序。我在这里有一个功能性 LINQ 表达式:

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

但我似乎无法想出等效的 MongoDB 表达式,我什至无法让 $project 函数工作:

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 驱动程序执行此操作的等效方法?

【问题讨论】:

  • 您是否错过了[]?还是只是一个错字?并且属性区分大小写。
  • 糟糕,我添加了括号,但它没有改变任何东西。我会将结果添加到原始帖子中。
  • 请检查下面的答案。

标签: c# linq mongodb


【解决方案1】:

利用$first 运算符和$$ROOT 变量来获取组中的第一个文档。

$$ROOT 是一个系统变量:

引用根文档,即顶级文档,当前 正在聚合管道阶段进行处理。

然后投影第一个文档。

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

【讨论】:

  • 我使用了这个代码:db.packages.aggregate([ { $sort : { PackageVersion : -1 } }, { $group: { _id: "$PackageId","PackageVersion":{$ first:"$PackageVersion"} } } ]) 这让我更接近,但我仍然需要选择所有属性,最好不要在项目声明中明确命名它们。这可能吗?
  • 是的,您需要使用$$ROOT 访问它。但是您会将文档绑定到一个键。请参阅更新后的答案。
  • 好的,成功了,谢谢,但是你能解释一下使用 $$ROOT 的作用吗?
  • 有没有什么办法可以在不将文档绑定到键的情况下做到这一点?
  • 没有。您需要在客户端执行此操作,或者您需要在小组赛阶段获取第一个文档的所有属性。
猜你喜欢
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2020-01-28
  • 2021-11-01
  • 1970-01-01
  • 2021-02-06
相关资源
最近更新 更多