如何使用MongoDB .NET驱动程序查询索引访问计数?

时间:2019-06-20 13:47:00

标签: mongodb .net-core mongodb-.net-driver

我正在寻找通过.NET驱动程序从MongoDB中检索索引使用情况信息。出于好奇,它是在集成测试中证明正在按预期使用索引,特别是访问次数。

我浏览了最新的API文档,发现IndexInfo,它提供索引元数据,但不提供统计信息。最接近的是CollectionStatsResult,但这不提供访问次数。

是否有提供我所寻找的API和数据结构?还有另一种较低级别的方法(例如,通过.NET驱动程序执行MongoDB asd命令的方法吗?

我知道有可能。我正在使用MongoDB Compass,运行测试时能够看到访问量增加。

1 个答案:

答案 0 :(得分:0)

该解决方案的一部分要贷给Alex Blex,该解决方案是将Aggregate$indexStats一起使用。

我最终得到了这段代码,该代码返回访问次数和上次访问时间的元组。它遍历代表返回结果的BsonDocument,寻找相关数据。

public async Task<(long AccessCount, DateTime LastAccessed)> GetIndexStatisticsAsync(string collectionName, string indexName)
{
    var statsPipeline = new[] { new BsonDocument(new BsonElement("$indexStats", new BsonDocument())) };

    using (var stats = await Database.GetCollection<BsonDocument>(collectionName).AggregateAsync<BsonDocument>(statsPipeline))
        while (await stats.MoveNextAsync())
        {
            var batch = stats.Current;
            var document = batch
                .Where(x => x.Elements.Any(y => y.Name.IsOneOf("key", "name") && y.Value == indexName))
                .Select(x => (BsonDocument)x.Elements.FirstOrDefault(y => y.Name == "accesses").Value)
                .FirstOrDefault();

            return document == null
                ? default
                : ((long)document.Elements.ElementAt(0).Value, (DateTime)document.Elements.ElementAt(1).Value);
        }

    return default;
}