[英]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.