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

问题描述 投票:1回答:1

我有一个具有以下结构的版本化文档集合(“ rHistory”):

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

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

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

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

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

如何找到与rid上的过滤器匹配的每个文档的最新版本,并将结果作为列表返回?我假设涉及聚合,但是在查找相关示例时遇到了麻烦。显然,我宁愿不这样做:

foreach (var rId in rIds)
{
    res.Add(_rHistory.Find(r => r.RId == rId).SortByDescending(f => f.Version).FirstOrDefault());
}
c# mongodb aggregation-framework aggregate mongodb-.net-driver
1个回答
1
投票

假设您的模型看起来像这样:

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

您可以按rid分组并返回.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" } } 
© www.soinside.com 2019 - 2024. All rights reserved.