我有一个具有以下结构的版本化文档集合(“ 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());
}
假设您的模型看起来像这样:
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" } }