如何在 MongoDB C# 驱动程序中获取结果子集?

How can I get a subset of results in MongoDB C# Driver?

我有一个版本化文档集合 ("rHistory"),结构如下:

    {
        "rid": "123e",
        "v": 1
    },
    {
        "rid": "143fe",
        "v": 1
    },
    {
        "rid": "143fe",
        "v": 2
    },
    {
        "rid": "143fe",
        "v": 3
    },
    {
        "rid": "123e",
        "v": 2
    }

我正在为 return 此集合中文档的子集编写一个函数。目前我找到所有匹配项如下:

_rHistory.Find(r => rIds.Contains(r.RId)).ToList()

但是,我只想 return 每个结果的最高版本项,如下所示:

    {
        "rid": "143fe",
        "v": 3
    },
    {
        "rid": "123e",
        "v": 2
    }

我如何才能找到每个文档的最新版本匹配 rid 上的过滤器,并且 return 结果作为列表?我假设涉及聚合,但我无法找到相关示例。显然我不想这样做:

foreach (var rId in rIds)
{
    res.Add(_rHistory.Find(r => r.RId == rId).SortByDescending(f => f.Version).FirstOrDefault());
}

假设您的模型如下所示:

public class Model
{
    public ObjectId Id { get; set; }
    public string rid { get; set; }
    public int v { get; set; }
}

您可以按 rid 和 return .Max() v:

分组
var col = database.GetCollection<Model>("rHistory");

var q = col.Aggregate()
    .Group(
        x => x.rid,
        gr => new {rid = gr.Key, v = gr.Max(f => f.v)});

var result = q.ToList();

MongoDB .NET 驱动程序会将此类查询转换为:

{ "$group" : { "_id" : "$rid", "v" : { "$max" : "$v" } }