我有一個 mongodb 集合,它有多個學生,每個學生都有多個這樣的記錄
[
{
"studentid": "stu-1234",
"dept": "geog",
"Status": 1,
"CardSwipeTimestamp": "2021-11-25T10:50:00.5230694Z"
},
{
"studentid": "stu-1234",
"dept": "geog",
"Status": 2,
"CardSwipeTimestamp": "2021-11-25T11:50:00.5230694Z"
},
{
"studentid": "stu-abc",
"dept": "geog",
"Status": 11,
"CardSwipeTimestamp": "2021-11-25T09:15:00.5230694Z"
},
{
"studentid": "stu-abc",
"dept": "geog",
"Status": 21,
"CardSwipeTimestamp": "2021-11-25T11:30:00.5230694Z"
}
]
我有一個聚合查詢在 C# Dotnet Core 3.1 中運行并獲取這樣的多條記錄。該查詢根據學生 ID 和部門名稱串列獲取每個學生的最新記錄,在這種情況下,它將獲得一條記錄 forsid=stu-abc和一條 for sid=stu-1234。
string [] sids = { array of Student ids here };
string deptName = "math";
var pipeline = new BsonDocument[]
{
new BsonDocument("$match",
new BsonDocument
{
{"studentid", new BsonDocument("$in",BsonArray.Create(sids))},
{"dept",dept}
}
),
new BsonDocument("$sort",new BsonDocument("CardSwipeTimestamp", -1)),
new BsonDocument("$group",
new BsonDocument{
{ "_id",
new BsonDocument
{
{ "studentid","$studentid" },
{ "dept","$dept"}
}
},
{ "Status",new BsonDocument("$first", "$Status")},
{ "CardSwipeTimestamp",new BsonDocument("$first", "$CardSwipeTimestamp")}
}
),
new BsonDocument("$project",
new BsonDocument
{
{ "_id", 0 },
{ "studentid", "$_id.studentid" },
{ "dept", "$_id.dept" },
{ "Status", "$Status" },
{ "CardSwipeTimestamp", "$CardSwipeTimestamp" }
}
),
new BsonDocument("$skip",0),
new BsonDocument("$limit",3),
};
collectionName.Aggregate<BsonDocument>(pipeline).ToList()
假設我的收藏有數百萬個條目和 1000 個學生 ID,我如何提供一種方法來回傳分頁串列?我不想獲取所有記錄,然后使用 C# linq 翻閱它們。我可以將一些頁面引數發送到上面的管道,這樣我就可以一次得到 20 條記錄,然后移動到下 20 條記錄,并從第一條記錄開始偏移嗎?在這方面需要一些幫助。
編輯
如上所述應用跳過和限制后,我只得到了分頁的日期,但不一致。如果我將 skip 作為 0 和 limit=1 傳入,它會得到 3 條記錄,但是當我翻到下一頁時,有時我會得到上一頁的記錄。
uj5u.com熱心網友回復:
之后$sort你需要添加這兩個:$skip和$limit。下面是一個示例(當然您需要對其進行引數化)。
new BsonDocument("$skip", 0},
new BsonDocument("$limit", 20},
這將啟用服務器端分頁。跳過/限制需要排序,否則您的結果不確定。
現在這種方法有效,但不是完全最優的。為了完全優化,您需要記住最后一頁的最后一條記錄并從那里開始,因為跳過從排序集中的第一個匹配項開始按順序跳過記錄(這意味著掃描,因此是線性的;記住檔案允許您做一個搜索,這是 O(1))。這超出了您的問題范圍,但這里有一個資源和另一個.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399232.html
