首页 > 解决方案 > 带有json返回的MongoDB运行命令

问题描述

我的总体目标是运行一个查询,显示所有集合的数据量/计数等。

我找到了以下命令/查询并尝试像这样运行它:

MongoClient client = new MongoClient(server);
var db = client.GetDatabase(database);
 
const string mongoQueryA = "var collectionNames = db.getCollectionNames(), stats = []; " +
"collectionNames.forEach(function(n) { stats.push(db[n].stats()); }); " +
"stats = stats.sort(function(a, b) { return b['size'] - a['size']; }); ";
var command = new JsonCommand<BsonDocument>(mongoQueryA);
var test = db.RunCommand<BsonDocument>(command);

代码在这里失败。例外:

JSON reader was expecting a value but found 'var'.

我的理解是这应该作为命令运行?

在机器人 T 中运行查询按预期工作。奖励计划是以以下格式返回数据(基于在机器人 T 中手动运行查询的 Json)

 class MongoCollectionInfo
    {
        public string ns { get; set; }

        public long size { get; set; }

        public long count { get; set; }

        public long avgObjSize { get; set; }

        public long storageSize { get; set; }

        public long nindexes { get; set; }

        public long totalIndexSize { get; set; }
    }

标签: c#mongodb

解决方案


您尝试实现的目标可以完全在 C# 中完成,因为看起来您尝试做的是将 javascript 发送到服务器以执行,这不是命令的工作方式。

首先,我们需要获取 MongoDB 实例内数据库中所有集合的列表。

var client = new MongoClient();

var db = client.GetDatabase("test");

var collectionNames = await (await db.ListCollectionNamesAsync()).ToListAsync();

一旦我们获得了集合名称 ( collectionNames),我们就可以通过发出命令向数据库询问该集合的统计信息。

var allCollStats = new List<BsonDocument>(collectionNames.Count);
foreach (var name in collectionNames)
{
    var collStatsResult = await db.RunCommandAsync(new BsonDocumentCommand<BsonDocument>(new BsonDocument("collStats", name)));

    allCollStats.Add(collStatsResult);
}

then 将保存集合的allCollStats所有统计信息,然后我们可以根据需要使用它

foreach (var collStats in allCollStats)
{
    Console.WriteLine($"ns: {collStats["ns"]}, size: {collStats["size"]}");
}

// ns: test.test, size: 117
// ns: test.people, size: 5092

此外,如果您想使用类型化结果而不是 a,BsonDocument您可以将其作为通用参数传递给命令。

var collStatsResult = await db.RunCommandAsync(new BsonDocumentCommand<MongoCollectionInfo>(new BsonDocument("collStats", name)));

Console.WriteLine($"ns: {collStatsResult .ns}, size: {collStatsResult .size}");

推荐阅读