You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:06:05