繁体   English   中英

C# MongoDB 每n组取5条记录

[英]C# MongoDB Take 5 records from every n group

您好亲爱的开发人员,

我在使用 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")
}

您必须使用聚合然后与项目分组。 如果需要对内部数组进行切片,则必须在投影中使用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();

您需要的聚合如下:

db.collection.aggregate(
[
    {
        $sort: { insertDate: -1 }
    },
    {
        $group: {
            _id: "$machinecode",
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            _id: 0,
            MachineCode: "$_id",
            Values: {
                $map: {
                    input: { $slice: ["$docs", 5] },
                    as: "x",
                    in: {
                        key: "$$x.key",
                        value: "$$x.value"
                    }
                }
            }
        }
    }
])

这不能使用 mongo 驱动程序的有限 LINQ 能力来完成,至少不能以强类型方式完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM