gpt4 book ai didi

c# - MongoDb.Driver IMongoDatabase.GetCollectionNamesAsync() 异常

转载 作者:可可西里 更新时间:2023-11-01 09:44:02 27 4
gpt4 key购买 nike

我使用 C# MongoDB.Driver 库连接到 MongoDB。一些有效的代码

MongoClient client = MongoClientBuilder.Build(
"77.199.99.90", 27016, "admin", "pwd");
IReadOnlyList<string> dbNames = this.client.GetDatabaseNamesAsync().Result;
foreach (var dbn in dbNames)
{
IMongoDatabase mongoDb = client.GetDatabase(dbn);
var cNames = mongoDb.GetCollectionNamesAsync().Result; <- THIS THROWS AggregateException.
foreach (var cn in cNames)
{
...
}
}

所以凭据是正确的,我得到了我的 IMongoDatabase 就好了,但是,当我尝试检索数据库中的集合时,我得到一个 AggregateException 当我执行 mongoDb.GetCollectionNamesAsync().Result,异常详情为

AggregateException InnerException (count 1) MongoQueryException: QueryFailure flag was true (response was { "$err" : "not authorized for query on taurusEvents.system.namespaces", "code" : 13 }).

我不确定这个异常告诉我什么。客户端上的身份验证很好,但我似乎可以查询数据库。我在这里缺少什么?


编辑。我现在意识到我需要使用凭据来执行此操作,但是,做

public static MongoClient Build(string host, int port,
string username, string password, string authDb)
{
MongoCredential cred = MongoCredential.CreateMongoCRCredential(authDb, username, password);
MongoClientSettings settings = new MongoClientSettings()
{
Credentials = new[] { cred },
Server = new MongoServerAddress(host, port)
};
return new MongoClient(settings);
}

我现在提供我的身份验证数据库名称 authDb 也会抛出上面相同的内部异常。


编辑#2。我发现如果我这样做了

var o = database.GetCollection<BsonDocument>("events");

通过明确引用集合名称,它起作用了,我得到了我的集合。但是我想要一个可用的集合列表,为什么 GetCollectionNamesAsync() 不起作用?


编辑#3。我使用以下方法创建我的服务器角色:

1。创建管理员用户:

use admin
db.createUser({user: "admin", pwd: "*******", roles: [{role: "userAdminAnyDatabase", db: "admin"}]})

2。创建其他用户,例如:

use admin
db.createUser({user: "mel", pwd: "*******", roles: [{role: "readWrite", db: "taurusEvents"}, {role: "readWrite", db: "taurusOdds"}, {role: "readWrite", db: "taurusState"}]})

感谢您的宝贵时间。

最佳答案

由于 .Result 在 .NET 中的工作方式,您将收到 AggregateException。

var result = task.Result; // throws an AggregateException if the task faulted

要让您的代码抛出内部异常,请使用:

var result = task.GetAwaiter().GetResult(); // throws the inner exception if the task faulted
var result = await task; // also throws the inner exception if the task faulted

我怀疑您收到此异常的原因是,当您使用有效凭据时(如果不是,您很快就会失败),您正在验证的用户无权读取 taurusEvents 数据库。

关于c# - MongoDb.Driver IMongoDatabase.GetCollectionNamesAsync() 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28350622/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com