簡體   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