c# - 带有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# 中完成,因为看起来您尝试做的是将 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}");
推荐阅读
- git - git 如何跟踪标记有 fixup/squash 标志的提交哈希?
- java - Java数组排序单词仅从列表中打印两个
- javascript - 双击 c3js 折线图
- amazon-redshift - 如何授予用户对系统表的有限访问权限?
- java - Braintree 集成 - 错误:找不到类:com.braintreepayments.api.dropin.DropInRequest
- php - 如何向新用户发送重置密码的通知
- java - Java 是否允许将 getter 作为方法参数传递?
- powerbi - 使用 Power BI 中的度量动态筛选列
- javascript - 尝试将 Dom 添加到 chrome-extension:// URL 时无法访问页面内容
- ios - 构建 iOS 框架时未找到 Ktor 和 kotlinx 依赖项