[英]How to get n records of each group in mongodb using C#, LINQ?
[英]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.