2016-06-21 6 views
2

C#에서 mongo (원격 서버의)에 연결하는 가장 좋은 방법은 무엇입니까?C에서 #mL3 MongoDB에 연결하는 데 문제가 있습니다.

스토리는 지금까지

나는 실험실 몽고에 연결 아주 기본적인 C#을 콘솔 응용 프로그램에서 간단한 발견을하려고 번거 로움의 끝이 없었습니다.

Mongo Shell과 RoboMongo를 사용하여 연결하고 내가 설정 한 콜렉션을 쿼리 할 수있었습니다. 하지만 여전히 동일한 자격 증명을 사용하고 있었지만 여전히 C# 코드를 사용하여 동일한 작업을 수행 할 수 없었습니다. 주로 데이터베이스 내에서 설정 한 컬렉션에 대해 실제로 찾기를 시도 할 때마다 시간이 초과되었습니다.

밖에있는 도움말 정보/예제/기타 등이 유용 할 정도로 너무 오래되었습니다.

내가 mLabs 몽고 연결 템플릿을 사용하고 있습니다 - 그것을 밖으로 항상 시간,하지만 이동 - 꽤 표준 물건

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

을 그리고 매우 표준 시도하고 컬렉션에서 읽을 수있는 일을. 반환 된 예외에 묻혀 인증에 대한 참조가 실패했습니다. 인증 관련 회원 중 한 명이 볼 수있는 여러 가지 개체를 검사하면 아무것도 표시되지 않습니다.

그래서 C#을 사용하여 원격 몽고 저장소에 연결하는 가장 좋은 방법은 무엇입니까? 좋은 물건을 모두 다루는 모범 사례가 포함 된 보너스 포인트입니다 (예 : 클러스터, 복제 세트 등

답변

3

워크 스루 : 나는 몽고의 실험실이있는 계정을 설정 한

(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 

방법의 모든 꽤 표준이지만, 여기 컬렉션에 대한 하나 :

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의 좋은 대답을 읽을 때까지. 다음은 웹 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; 
     }