2016-06-21 19 views
2

c#からmongo(リモートサーバー上)に接続するにはどうすればよいですか?mLabに接続できませんMongoDB from C#

ストーリーこれまで

私はラボをモンゴに接続する非常に基本的なC#のコンソールアプリケーションから簡単な検索をしようと手間の終わりがなかったしました。

私はMongo ShellとRoboMongoの両方を使用して接続し、私が設定したコレクションに問い合わせることができました。しかし、私はまだ同じコードを使用していましたが、私のC#コードでも同じことをすることはできませんでした。主に、データベース内で設定したコレクションに対して実際に検索を実行しようとするたびにタイムアウトしていました。

役に立った役に立った役に立った非常に役に立ったメールがありますか?

私はmLabsのモンゴ接続テンプレート使用しています - かなり標準のもの

mongodb://<dbuser>:<dbpassword>@<serverName>.mlab.com:<port>/<databaseName> 

、非常に標準試してみて、コレクションから読み取る事やって - それは、常にタイムアウトする、ない行きます。返された例外に埋もれて、認証への参照に失敗しました。また、認証関連のメンバーの1つが見ることのできるさまざまなオブジェクトを調べると、空白になりました。

質問を書き直すには、c#を使用してリモートのmongoリポジトリに接続するにはどうすればよいでしょうか? すべての優れたものを処理するためのベストプラクティスが含まれている場合は、ボーナスポイントとなります。クラスタ、複製セットなど

答えて

3

ウォークスルー:

私はMongoのラボ(www.mlab.com)でアカウントを設定していると私は成功した彼らを経由して接続することができますよウェブUI

データベースを作成した後、mongoシェルとrobomongoを使用してデータベースに接続しようとしましたが、成功しませんでした。

掘り下げた後、簡単な答えが見つかりました。追加のユーザーを作成し、そのユーザーにデータベースへの特定のアクセス権を与える必要がありました。そのユーザーの資格情報を使用してデータベースにアクセスします。

私はそれをすべて行い、今ではMongoシェルとRoboMongoの両方を使用してデータベースに接続し、コレクションをクエリできます。

しかし、私はまだC#コードで質問することができませんでした - まったく同じ資格情報(大文字小文字を含む) - しかし、私はちょうど検索を実行しようとするとタイムアウトしました。 http://stackoverflow.com/questions/30758668/how-to-get-connection-status-in-the-c-sharp-mongodb-driver-v2-0 、それはMongoUrlの代わりにクライアントを作成する際にMongoClientSettingsを使用しようとする私に手掛かりを与えた:

私は最終的にこれを見つけました。 私はこのコードのビットを思い付いた:私はクライアントを作成するには、このフォームで資格情報を使用する場合、それが働いた

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 

方法のすべてはかなり標準的なものであるが、ここでは、コレクションのための1つです:

private static IMongoCollection<BsonDocument> CollectionConnection(IMongoDatabase database, string collectionName) 
{ 
    var collection = database.GetCollection<BsonDocument>(collectionName); 

    return collection; 
} 
2

はリンクをご覧ください以下:

1)MongoDBのURI(C#の):MongoURI

2)MLAB(オンラインMongoDBのためにホスティング):mlab.com

あなたのデータベースをホストするプロセスを完了した後、次のコードをオンラインでデータベースをテストすることができます。

try 
{ 
    string connectstring1 = "mongodb://user1:[email protected]*****.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); 
} 
0

私はMLABのMongoDBへの接続に苦労しました@ Lee-Hの良い答えを読むまで。以下は、Web APIコントローラーの基本クラス用に記述したコードです。必要に応じて明らかに、あなたは、あなたのコントローラにこの権利を投げることができます:私は@リー-Hは彼がやった言ったように、パスワードに埋め込まれた接続文字列を経由して接続するには戻りませんでしたので、私は確認していません

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は彼が彼のためにそのように働き始めたと言います。

幸運。

0

タスククラスを使用してMongoDBにデータを挿入しようとしています。しかし、一部のMongoDBクラスは廃止されました。

public class Task 
    { 
     [BsonId(IdGenerator = typeof(CombGuidGenerator))] 
     public Guid ID { get; set; } 

     [BsonElement("Artist")] 
     public string Name { get; set; } 

     [BsonElement("Song")] 
     public string Song { get; set; } 
    } 

public void CreateTask(Task task) 
     { 
      MongoCollection<Task> collection = GetTaskCollection(); 

      try 
      { 
       collection.Insert(task); 

      } 
      catch(MongoCommandException ex) 
      { 

       string message = ex.Message; 
      } 
     } 

     private void insert_Click(object sender, EventArgs e) 
     { 

      string name = txtBxName.Text; 
      string song = txtBxSong.Text; 

      Task t = new Task 
      { 

       Name = name, 

       Song = song 
      }; 
      Dal d = new Dal(); 

      List<Task> list = new List<Task>(200); 
      list.Add(t); 

      data.DataSource = list; 
     } 
関連する問題