首页 > 解决方案 > C# MongoDB 从每 n 组中获取 5 条记录

问题描述

您好亲爱的开发人员,

我在使用 MongoDB C# 驱动程序时遇到问题并寻求帮助。

我正在尝试按 machineCode 列对记录进行分组,并从每列中获取 5 条记录。并且还尝试对所有按 insertDate 降序的记录进行排序。

到目前为止,我已经尝试了来自 SO 的几个线程,但在所有尝试中都失败了。

var list = d3TestCollection
    .AsQueryable<D3TestData>()
    .OrderByDescending(q => q.InsertDate)
    .GroupBy(f => f.machinecode)
    .Select(f => new D3MachineListResult {
        MachineCode = f.Key,
        Values = f.Select(q => new D3KeyValueMap { Key = q.Key, Value = q.Value })
                  .Take(5)
                  .ToList()
    }).ToList();

由于 Take(5),此代码会引发 Method Not Supported 错误。

谢谢你们。

示例集合:

{
    "_id" : ObjectId("60a607be339f7c44c0d43b70"),
    "key" : "KEY1",
    "machinecode" : "3DTEST1",
    "value" : false,
    "insertDate" : ISODate("2021-05-20T06:54:54.941Z")
},
{
    "_id" : ObjectId("60a607be339f7c44c0d43b70"),
    "key" : "KEY1",
    "machinecode" : "3DTEST2",
    "value" : false,
    "insertDate" : ISODate("2021-05-20T06:54:54.941Z")
},
{
    "_id" : ObjectId("60a607be339f7c44c0d43b70"),
    "key" : "KEY2",
    "machinecode" : "3DTEST3",
    "value" : false,
    "insertDate" : ISODate("2021-05-20T06:54:54.941Z")
},
{
    "_id" : ObjectId("60a607be339f7c44c0d43b70"),
    "key" : "KEY2",
    "machinecode" : "3DTEST4",
    "value" : false,
    "insertDate" : ISODate("2021-05-20T06:54:54.941Z")
}

标签: c#mongodbaggregation-frameworkmongodb-.net-driver

解决方案


您必须使用聚合然后与项目分组。如果需要对内部数组进行切片,则必须Take在投影中使用,而不是在分组中使用。

var list = d3TestCollection //IMongoCollection<D3TestData>
        .Aggregate() //IAggregateFluent<D3TestData>
        .SortByDescending(field: x => x.InsertDate)
        .Group(
                id: x => x.machinecode,
                group: x => new D3MachineListResult
                {
                    MachineCode = x.Key,
                    Values = x
                        .Select(z => new D3KeyValueMap
                        {
                            Key = z.Key,
                            Value = z.Value
                        })
                }
            )
        .Project(
            projection: x => new D3MachineListResult
            {
                MachineCode = x.Key,
                Values = x
                    .Select(z => new D3KeyValueMap
                    {
                        Key = z.Key,
                        Value = z.Value
                    })
                    .Take(5)
                
            })
        .ToList();

推荐阅读