- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用 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/
我正在使用 Moq 在 ASP.NET Core 项目中模拟我的对象。 我想模拟以下 IsConnection() 方法: public Client(IMongoClient client) {
我使用 C# MongoDB.Driver 库连接到 MongoDB。一些有效的代码 MongoClient client = MongoClientBuilder.Build( "77.19
当我使用 FindOne 时,它说“'MongoClientExtensions.GetServer(MongoClient)' is obsolete: 'Use the new API ins
我是一名优秀的程序员,十分优秀!