使用C#查询MongoDB中的TTL索引方法咨询
MongoDB C#驱动中检测TTL索引的问题
我在使用IMongoCollection的Indexes.List()方法时发现,返回的索引信息仅包含索引字段,看不到expireAfterSeconds这类TTL索引的关键选项:
var indexes = collection.Indexes.List().ToList();
返回的BsonDocuments示例如下:
[v=2, key={ "_id": 1 }, name=_id_] [v=2, key={ "fieldA": 1 }, name=fieldA_1] [v=2, key={ "fieldB": 1, "fieldC": -1 }, name=fieldB_1__fieldC_-1]
这导致我无法判断集合是否存在TTL索引。
背景:我们存储的详细日志(消息、处理过程及响应)增长迅速,支持人员常通过删除集合恢复系统,但重建后的集合没有TTL索引。我们希望在应用重启时确保诊断集合的TTL索引存在,但目前的C#代码没法检测索引是否设置了expireAfterSeconds。
解决方法
方式一:直接创建TTL索引(推荐)
无需提前检测,直接在应用启动时执行创建TTL索引的逻辑,MongoDB驱动会自动忽略已存在的同名同配置索引:
// 假设LogEntry是你的日志实体类,CreatedAt是用于TTL的时间字段 var indexKeys = Builders<LogEntry>.IndexKeys.Ascending(x => x.CreatedAt); var indexOptions = new CreateIndexOptions { ExpireAfter = TimeSpan.FromHours(24), // 设置24小时后过期 Name = "CreatedAt_TTL" // 指定索引名称,确保唯一性 }; await collection.Indexes.CreateOneAsync(new CreateIndexModel<LogEntry>(indexKeys, indexOptions));
方式二:检测已存在的TTL索引
如果确实需要检查现有索引是否包含TTL配置,可以遍历索引文档,直接访问expireAfterSeconds字段(注意:之前的字符串输出是简化显示,实际BsonDocument中包含该字段):
var indexes = await collection.Indexes.ListAsync(); await indexes.ForEachAsync(indexDoc => { if (indexDoc.Contains("expireAfterSeconds")) { int expireSeconds = indexDoc.GetValue("expireAfterSeconds").AsInt32; // 这里可以添加自定义处理逻辑 Console.WriteLine($"找到TTL索引:{indexDoc["name"]},过期时长:{expireSeconds}秒"); } });
内容的提问来源于stack exchange,提问作者enorl76
相关产品推荐
相关产品推荐

