Laden...

MongoDB mit C# auslesen

Erstellt von oehrle vor einem Jahr Letzter Beitrag vor einem Jahr 916 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor einem Jahr
MongoDB mit C# auslesen

Hallo, ich habe vor einem Monat ein Datentool testweise an ein System ageschlossen, um die Zustände zu sehen.
Diese Daten werden in einer MongoDB gespeichert.

Nun würde ich gerne die Daten ode Tabellen der MongoDB auslesen oder analysieren.
Ich habe dann mal gegoogelt, was es für C# so gibt, und bin bei folgendem hängen geblieben (NuGet): MongoDb.Driver V2.18.0

Habe dann mal fogendes probiert:


// Replace the uri string with your MongoDB deployment's connection string.
var client = new MongoClient("mongodb+srv://<username>:<password>@<cluster-address>/test?w=majority");
var database = client.GetDatabase("test");

Hier mal mein Beispiel, wie ich das mache:


MongoClient cMongoClient = new MongoClient("mongodb://USERNAME:PASSWORD@IPADRESS/DATENBANKNAME?w=majority");
var database = client.GetDatabase("DATENBANKNAME");

Wenn ich nun weiter gehe und die Namen der Tabellen ausgeben möchte, tritt ein Fehler auf


                //// .... hier kommt dann Fehler 
                var testDatabases =  cMongoClient.ListDatabaseNames().ToList();

Ist da bei der Anmeldelogik etwas falsch im Aufbau?

Hinweis von gfoidl vor einem Jahr

[Hinweis] Wie poste ich richtig? Punkt 6 sollte mittlerweile bekannt sein.
Das sollte keine lästige Pflicht sein, sondern den potentiellen Helfern das Helfen erleichten, damit du eine passende Antwort bekommst -- also schon aus Eigeninteresse sollten Beiträge und v.a. Code formatiert werden.

6.911 Beiträge seit 2009
vor einem Jahr

Hallo oehrle,

tritt ein Fehler auf

Du bist ja nicht erst seit Kurzem beim Forum dabei und wohl auch als Entwickler tätig. Daher solltest du auch wissen dass "ein Fehler" eine sehr exakte Beschreibung vom Problem ist, bei der sich jeder sofort auskennt und zielgerichtet eine hilfreiche Antwort verfassen kann. Oder auch nicht...

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
2.224 Beiträge seit 2008
vor einem Jahr

Du bekommst mit ListDatabaseNames nicht die Tabellen sondern die Datenbanken.
Laut Doku sollte es hier auch keine Exception geben, was auf einen Fehler wie z.B. Verbindungs- oder Rechteprobleme hinweist.

Doku:
MongoClient.ListDatabaseNames Method (CancellationToken)

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor einem Jahr

Diese MEldung kommt nach dem Aufruf von:



                //// .... hier kommt dann Fehler 
                var testDatabases =  cMongoClient.ListDatabaseNames().ToList();

Fehlermeldung:
System.TimeoutException: "A timeout occurred after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 }, OperationsCountServerSelector }. Client view of cluster state is { ClusterId : "1", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "10.38.143.27:27017" }", EndPoint: "10.38.143.27:27017", ReasonChanged: "Heartbeat", State: "Disconnected", ServerVersion: , TopologyVersion: , Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server.
---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 10.38.143.27:27017
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.Connect(Socket socket, EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.CreateStream(EndPoint endPoint, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelper(CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelper(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.BinaryConnection.Open(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.ServerMonitor.InitializeConnection(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.ServerMonitor.Heartbeat(CancellationToken cancellationToken)", LastHeartbeatTimestamp: "2023-01-10T09:02:09.0192194Z", LastUpdateTimestamp: "2023-01-10T09:02:09.0192200Z" }] }."

  • Eigentlich würde ich gerne die Struktur / Tabellen der Datenbank auslesen.
  • Wenn ich die datenbanken abfragen könnte, wäre das auch gut, aber n diesem Fall geht das ding auf die Bretter ...
Hinweis von gfoidl vor einem Jahr

Erneut der Hinweis zu [Hinweis] Wie poste ich richtig? Punkt 6.

6.911 Beiträge seit 2009
vor einem Jahr

Hallo oehrle,

hast du dir die Fehlermeldung auch durchgelesen? V.a. die InnerException? Hier nochmal der Einfachheithalber:

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 10.38.143.27:27017

Ist also die DB erreichbar? Firewall, etc. gestattet den Zugriff? Kann z.B. via Robomongo auf die DB zugegriffen werden usw.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
2.224 Beiträge seit 2008
vor einem Jahr

Die Fehlermeldung sagt doch schon alles.
Du kannst mit deinen Daten keine Verbindung zum Server herstellen, hier knallt es sogar direkt bei Socket.
Wenn hier ggf. eine Firewall zwischen dir und dem Server liegt, scheint diese die Verbindung zu blocken.
Kann auch lokale Firewall des Servers oder Clients sein.

Nachtrag:
gfoidl war schneller 🙂

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor einem Jahr

Hallo, es war der falsche Port in der Firewall, so ein Schitt.
Aber jetzt bekomme ich die Verbindung, und die ListDataBaseNames().

Nun muss ich mal sehen wie ich da die Daten raus bekomme, probiere erst mal ...

T
2.224 Beiträge seit 2008
vor einem Jahr

Oder ganz einfach in die Doku schauen oder auf der Seite von MongoDB.Driver einen Schnelleinstieg anschauen, wo dies schon gezeigt wird.

Link:
Quick Tour

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor einem Jahr
Collection auslesen

Hallo, ich wollte erst mal alle Collections erfassen, aber da wird auch eine Exceptin geworfen, das muss mit der Userberechtigung zu tun haben.
Erst mal nichts desto trotz, ich habe in der Doku von dem Tool Angaben zu verschiedenen Entities gefunden, und mal eine ausprobiert, soweit klappt das.


#if true
                //// Geht noch ... Verbinden mit Datenbank
                var database = cMongoClient.GetDatabase("MTLINKi");


                //// Bekannte Collection erfassen
                var collection = database.GetCollection<BsonDocument>("Program_History");

#endif

Meine weitere Frage, wie kann ich denn dann durch diese collection iterieren, ich würde diese gerne als DataTable in einem DataGrid darstellen.
Dahinter verbirgt sich JSON, ist das korrekt?

Hinweis von gfoidl vor einem Jahr

Ist das mit den Code-Tags tatsächlich so schwer?

T
2.224 Beiträge seit 2008
vor einem Jahr

hast du dich überhaupt mal mit MongoDB beschöftigt oder machst du nur Trial and Error?
MongoDB ist eine Dokumenten Datenbank (NoSQL).
Du arbeitest hier nur mit Json, musst also die Daten per De-/Serialisierung zwischen deinem Code und JS konvertieren.
Die Doku samt Quick Tour hast du, damit kannst du im Grunde alles machen.

Ansonsten solltest du von DataTable die Finger lassen.
Du kannst hier mit Data Binding arbeiten und direkt die richtige DataSource mitgeben.
Ist alles dokumentiert, musst du nur lesen und umsetzen.

MongoDB
https://www.mongodb.com/docs/manual/core/document/

Nachtrag:
Nutzt bitte, wie schon zwei mal per Kommentar Edit empfohlen, auch die Code Tags.
Dein Code lässt sich sonst sehr schlecht lesen, was kaum zu mehr Hilfe motiviert wenn man lieblos den Code ohne Formatierung postet.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor einem Jahr

Ja T-Virus, wie so oft. man wird ins kalte Wasser geworfen und soll schnell damit umgehen und was rausholen können.

Was die Sache mit der MongoDB angeht, ich bin da Frischling, ich muss mich damit beschäftigen. Ich muss aus einem System die Daten auswerten, diese sind in einer MongoDB enthalten, aber es gibt von diesen Daten auch Endpoints (REST), die ich auch abgreifen kann (oder schon mache).

Jetzt muss ich mich damit erst mal zurechtifinden (Umgang / Aufbau), habe auch schon gesehen das in den Endpoints Daten fehlen, aber ich denke diese entstehen alle aus den Daten der MongoDB. Ich muss mich nun mal vortasten ...