演练:
我已经在 mongo labs (www.mlab.com) 上设置了一个帐户,并且能够通过他们的 Web UI 成功连接到该帐户。
我创建了一个数据库,然后尝试使用 mongo shell 和 robomongo 连接到它 - 没有成功。
经过大量挖掘,我找到了简单的答案 - 我需要创建一个额外的用户并授予该用户对数据库的特定访问权限。并使用该用户的凭据访问数据库。
所以我做了所有这些,现在我可以使用 Mongo shell 和 RoboMongo 连接到数据库并查询集合。
但我仍然无法使用我的 c# 代码进行查询——完全相同的凭据(包括大小写)——但我在尝试执行查找时遇到了超时。
我最终发现了这个:
http://stackoverflow.com/questions/30758668/how-to-get-connection-status-in-the-c-sharp-mongodb-driver-v2-0
它给了我一个线索,让我在创建客户端时尝试使用MongoClientSettings 而不是MongoUrl。
我想出了这段代码:
var credential = MongoCredential.CreateCredential(DatabaseName, UserName, Password);
var mongoClientSettings = new MongoClientSettings
{
Server = new MongoServerAddress(serverAddress, Port),
Credentials = new List<MongoCredential> {credential}
};
并且当我使用此表单中的凭据创建客户端时它起作用了。
奇怪的是,既然我已经成功使用了 MongoClientSettings,我可以重新使用 MongoUrl - 就好像 mLabs/mongo 服务器端的一些突出价值终于被正确默认了。
每个步骤的完整调用块如下所示:
var mongoClientSettings = BuildMongoClientSettings();
var client = ClientConnection(mongoClientSettings);
var database = DatabaseConnection(client, DatabaseName);
var collection = CollectionConnection(database, CollectionName);
var data = collection.Find(_ => true).ToList(); // yes I know it's not async - that comes next
所有的方法都很标准,但这里是合集的一个:
private static IMongoCollection<BsonDocument> CollectionConnection(IMongoDatabase database, string collectionName)
{
var collection = database.GetCollection<BsonDocument>(collectionName);
return collection;
}