如何使用C#从MongoDB集合中按最后时间戳和过滤条件获取BsonDocument
问题1:查询特定学生的最后一次刷卡时间
你不需要提前知道准确时间,仅过滤学生ID后按刷卡时间倒序取第一条即可,代码如下:
var _collection = database.GetCollection<BsonDocument>("entrycard_swipetimes"); var filter = Builders<BsonDocument>.Filter.Eq("studentid", "stu-1234"); // 按刷卡时间倒序排序,第一条就是最新的刷卡记录 var latestRecord = _collection.Find(filter) .SortByDescending(d => d["Carddetails"]["LastSwipeTimestamp"]) // 可选:仅提取需要的时间字段,减少数据传输 .Project(d => d["Carddetails"]["LastSwipeTimestamp"].AsString) .FirstOrDefault();
返回的latestRecord就是该学生的最后一次刷卡时间字符串。
问题2:查询所有学生近30天的最后刷卡时间 + 20条/页分页
需要用MongoDB的聚合管道实现,先过滤时间范围、按学生分组取最新刷卡时间,再做分页,代码如下:
var _collection = database.GetCollection<BsonDocument>("entrycard_swipetimes"); // 计算30天前的UTC时间,匹配你的时间格式 var thirtyDaysAgo = DateTime.UtcNow.AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); int page = 1; // 替换为实际查询的页码,从1开始 var aggregationPipeline = new BsonDocument[] { // 第一步:过滤仅保留近30天的刷卡记录,缩小计算范围 new BsonDocument("$match", new BsonDocument("Carddetails.LastSwipeTimestamp", new BsonDocument("$gte", thirtyDaysAgo)) ), // 第二步:按学生ID分组,取每组最大的刷卡时间作为该学生的最后刷卡记录 new BsonDocument("$group", new BsonDocument { { "_id", "$studentid" }, { "LastSwipeTimestamp", new BsonDocument("$max", "$Carddetails.LastSwipeTimestamp") } }), // 可选:按最后刷卡时间倒序排序,也可以按学生ID排序 new BsonDocument("$sort", new BsonDocument("LastSwipeTimestamp", -1)), // 分页逻辑 new BsonDocument("$skip", (page - 1) * 20), new BsonDocument("$limit", 20) }; // 执行查询 var pageResult = _collection.Aggregate<BsonDocument>(aggregationPipeline).ToList();
优化提示
如果数据量较大,建议给studentid和Carddetails.LastSwipeTimestamp字段加联合索引,可大幅提升两个查询的执行效率。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

