Ich mache ein Node.js-Projekt, das Unterprojekte enthält. Ein Unterprojekt wird eine Mongodb-Datenbank haben und Mongoose wird zum Umschließen und Abfragen von db verwendet. Aber das Problem ist
- Mongoose erlaubt nicht die Verwendung mehrerer Datenbanken in einer einzigen Mungo-Instanz, da die Modelle auf einer Verbindung basieren.
Um mehrere Mungo-Instanzen zu verwenden, erlaubt Node.js nicht mehrere Modulinstanzen, da das Caching-System vorhanden ist
require()
. Ich weiß, dass das Modul-Caching in Node.js deaktiviert wird, aber ich denke, dass dies nicht die gute Lösung ist, da nur Mungo benötigt wird.Ich habe versucht,
createConnection()
undopenSet()
in Mungo zu verwenden, aber es war nicht die Lösung.Ich habe versucht, die Mungo-Instanz ( http://blog.imaginea.com/deep-copy-in-javascript/ ) tief zu kopieren , um neue Mungo-Instanzen an das Unterprojekt zu übergeben, aber es wird geworfen
RangeError: Maximum call stack size exceeded
.
Ich möchte wissen, ob es überhaupt möglich ist, mehrere Datenbanken mit Mungo oder eine Problemumgehung für dieses Problem zu verwenden. Weil ich denke, Mungo ist ziemlich einfach und schnell. Oder andere Module als Empfehlungen?
useDb
Befehl zu verwenden, der denselben Verbindungspool verwendet.Nach dem Fein Handbuch ,
createConnection()
kann verwendet werden , um mehrere Datenbanken zu verbinden.Sie müssen jedoch für jede Verbindung / Datenbank separate Modelle erstellen:
Ich bin mir ziemlich sicher, dass Sie das Schema zwischen ihnen teilen können, aber Sie müssen überprüfen, um sicherzugehen.
quelle
useDb()
In 3.8 ist auch eine Kasse verfügbar, um den zugrunde liegenden Verbindungspoolvar newSchema = new mongoose.Schema({ ... })
,var model2 = conn1.model('newModel', newSchema)
,var model2 = conn2.model('newModel', newSchema)
Ziemlich spät, aber das könnte jemandem helfen. Bei den aktuellen Antworten wird davon ausgegangen, dass Sie für Ihre Verbindungen und Modelle dieselbe Datei verwenden.
Im wirklichen Leben besteht eine hohe Wahrscheinlichkeit, dass Sie Ihre Modelle in verschiedene Dateien aufteilen. Sie können so etwas in Ihrer Hauptdatei verwenden:
Genau so wird es in den Dokumenten beschrieben. Führen Sie dann in Ihren Modelldateien folgende Schritte aus:
Wobei myDB Ihr Datenbankname ist.
quelle
test
und auch zur Vermeidung mehrerer Verbindungen benötigte. Allerdings habe ich auch.db
am Ende (const v1 = mongoose.connection.useDb('test').db
) da die alte Datenbank nicht mungo verwaltet werden muss.Als alternativen Ansatz exportiert Mongoose einen Konstruktor für eine neue Instanz in die Standardinstanz. So etwas ist also möglich.
Dies ist sehr nützlich, wenn Sie mit separaten Datenquellen arbeiten und wenn Sie für jeden Benutzer oder jede Anforderung einen separaten Datenbankkontext haben möchten. Sie müssen vorsichtig sein, da dabei viele Verbindungen hergestellt werden können. Stellen Sie sicher, dass Sie connectect () aufrufen, wenn keine Instanzen benötigt werden, und die von jeder Instanz erstellte Poolgröße begrenzen.
quelle
await instance1.connection.collection('foo').insert({ foo: 'bar', }) await instance2.connection.collection('foo').insert({ foo: 'zoo', })
Eine etwas optimierte (zumindest für mich) Lösung. Schreiben Sie dies in eine Datei db.js und fordern Sie dies an, wo immer dies erforderlich ist, und rufen Sie es mit einem Funktionsaufruf auf, und Sie können loslegen.
quelle