Как запросить счетчик доступа к индексу с помощью драйвера MongoDB .NET? - PullRequest
0 голосов
/ 20 июня 2019

Я ищу информацию об использовании индекса из MongoDB через драйвер .NET. Любопытно, что в интеграционном тесте нужно доказать, что индекс используется по назначению, а именно количество обращений.

Я пролистал последние документы API и нашел IndexInfo , который предоставляет метаданные индекса, но не статистику. Наиболее близким является CollectionStatsResult , но это не дает счетчик доступа.

Есть ли API и структура данных, которые обеспечивают то, что я ищу? Есть ли другой способ более низкого уровня (например, способ выполнить команду MongoDB asd через драйвер .NET?

Я знаю, что это возможно. Я использую MongoDB Compass и могу видеть увеличение доступа при запуске теста.

1 Ответ

0 голосов
/ 20 июня 2019

Благодарим Алекса Блекса за часть решения, которая должна использовать 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;
}
...