【发布时间】:2022-01-27 09:11:15
【问题描述】:
我有一个 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 和部门名称列表获取每个学生的最新记录,在这种情况下,它将获取 sid=stu-abc 的一条记录和 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 条记录,但是当我翻到下一页时,有时我会得到上一页中的记录。
【问题讨论】:
-
$group 不对其输出文档进行排序。
-
@Valijon 我已经编辑了我的问题。检查我如何应用带有跳过和限制的排序。您是否认为在应用跳过和限制时导致响应不一致的问题是缺少排序?
标签: c# mongodb .net-core mongodb-query