从c#连接到mongo(在远程服务器上)的最佳方法是什么?
到目前为止故事
我从一个连接到mongo labs的非常基本的c#控制台应用程序中尝试进行简单的查找,一点也没有麻烦。
我能够使用Mongo Shell和RoboMongo连接并查询我设置的集合。但我仍然无法对我的c#代码做同样的事情 - 尽管我使用的是相同的凭据。每当我尝试对数据库中设置的集合实际执行查找时,主要是超时。
所有帮助信息/示例/等等都是Waaaaaaaaaaaaa太旧而无用。
我正在使用mLabs mongo连接模板 - 相当标准的东西
mongodb://<dbuser>:<dbpassword>@<serverName>.mlab.com:<port>/<databaseName>
做非常标准的事情尝试从集合中读取 - 但是没有去,它总是超时。在返回的异常中埋藏是对身份验证失败的引用。检查我可以看到的各种对象,其中一个身份验证相关成员是空白的。
所以重申一下这个问题 - 使用c#连接到远程mongo存储库的最佳方式是什么? 奖励积分,如果它包括处理所有好东西的最佳做法,例如集群,复制集等
答案 0 :(得分:3)
<强>演练:强>
我已经在mongo labs(www.mlab.com)设立了一个帐户,我可以通过他们的网络用户界面成功连接到它。
我创建了一个数据库,然后尝试使用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;
}
答案 1 :(得分:2)
查看以下链接:
1)MongoDB uri(c#):MongoURI
2)Mlab(MongoDB的在线托管):mlab.com
完成托管数据库的过程后,您可以使用以下代码在线测试数据库:
try
{
string connectstring1 = "mongodb://user1:password1@ds*****.mlab.com:234***/dbname";
MongoClient client = new MongoClient(connectstring1);
var db = client.GetDatabase("dbname");
var collection = db.GetCollection<BsonDocument>("collectionName");
var filter1 = Builders<BsonDocument>.Filter.Empty;
var filter = new BsonDocument();
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (var document in batch)
{
MessageBox.Show(document[1].ToString(), "msg");
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
答案 2 :(得分:0)
我努力连接到我的mLab MongoDB,直到我读到@ Lee-H的好答案。以下是我为Web API控制器的基类编写的代码。显然,您可以根据需要将其放在控制器中:
public abstract class CtrlBase : ApiController
{
private IMongoDatabase _db = null;
protected IMongoDatabase DB
{
get
{
if (_db == null)
{
var cred = MongoCredential.CreateCredential("user", "password");
var sett = new MongoClientSettings
{
Server = new MongoServerAddress("server", <port>),
Credentials = new List<MongoCredential> { cred }
};
var client = new MongoClient(sett);
_db = client.GetDatabase("dbName");
}
return _db;
}
}
protected IMongoCollection<Thing> Things
{
get { return DB.GetCollection<Thing>("mythings"); }
}
}
请注意,我没有恢复通过密码嵌入的连接字符串进行连接,因为@ Lee-H说他做了,所以我没有证实如果我换回它会这样工作,因为它会让我感到烦恼。尽管如此,@ Lee-H说它开始以这种方式为他工作。
祝你好运。答案 3 :(得分:0)
我正在尝试使用任务类将数据插入MongoDB。但是一些MongoDB类已被弃用。
Switch