Mongoose und mehrere Datenbanken in einem einzelnen node.js-Projekt

Lesezeit: 7 Minuten

Mongoose und mehrere Datenbanken in einem einzelnen nodejs Projekt
Puppe

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 Datenbanken verwendet. Aber das Problem ist

  • Mongoose erlaubt nicht die Verwendung mehrerer Datenbanken in einer einzigen Mongoose-Instanz, da die Modelle auf einer Verbindung aufgebaut sind.
  • Um mehrere Mungo-Instanzen zu verwenden, lässt Node.js nicht mehrere Modulinstanzen zu, da es über ein Caching-System verfügt require(). Ich weiß, dass das Caching von Modulen in Node.js deaktiviert ist, aber ich denke, es ist keine gute Lösung, da es nur für Mungo benötigt wird.

    Ich habe versucht zu verwenden createConnection() und openSet() in Mungo, aber es war nicht die Lösung.

    Ich habe versucht, die Mongoose-Instanz tief zu kopieren (http://blog.imaginea.com/deep-copy-in-javascript/), um neue Mungo-Instanzen an das Unterprojekt zu übergeben, aber es wirft RangeError: Maximum call stack size exceeded.

Ich möchte wissen, gibt es trotzdem mehrere Datenbanken mit Mungo oder eine Problemumgehung für dieses Problem? Weil ich denke, Mongoose ist ziemlich einfach und schnell. Oder irgendwelche anderen Module als Empfehlungen?

Entsprechend das feine Handbuch, createConnection() kann verwendet werden, um eine Verbindung zu mehreren Datenbanken herzustellen.

Sie müssen jedoch für jede Verbindung/Datenbank separate Modelle erstellen:

var conn      = mongoose.createConnection('mongodb://localhost/testA');
var conn2     = mongoose.createConnection('mongodb://localhost/testB');

// stored in 'testA' database
var ModelA    = conn.model('Model', new mongoose.Schema({
  title : { type : String, default : 'model in testA database' }
}));

// stored in 'testB' database
var ModelB    = conn2.model('Model', new mongoose.Schema({
  title : { type : String, default : 'model in testB database' }
}));

Ich bin mir ziemlich sicher, dass Sie das Schema zwischen ihnen teilen können, aber Sie müssen überprüfen, um sicherzugehen.

  • Ja, benannte Verbindungen und ein gemeinsames Schema sind meiner Meinung nach der richtige Weg. Jede Verbindung benötigt ein eindeutiges Modell gemäß Roberts Beispiel.

    – Simon Holmes

    22. Oktober 2013 um 6:44 Uhr

  • Auch zur Kasse useDb() verfügbar in 3.8, um den zugrunde liegenden Verbindungspool zu teilen: github.com/LearnBoost/mongoose/wiki/…

    – aaronheckmann

    2. November 2013 um 15:21 Uhr

  • Angenommen, ich habe eine automatisch generierte Datenbank (z. B. n-Nummer der Datenbank). Nicht ein oder zwei. Gibt es eine Möglichkeit, eine Verbindung zu diesen herzustellen, ohne für jede Datenbank ein separates Modell zu erstellen?

    – Anooj Krishnan G

    18. Februar 2015 um 17:53 Uhr

  • @AnoojKrishnanG Ich glaube nicht, dass das möglich ist, nein. Sie müssen das Modell für jede Datenbank separat erstellen. Wie ich jedoch bereits in meiner Antwort erwähnt habe, können Sie die möglicherweise teilen Schemas zwischen den Verbindungen, was etwas Codierzeit sparen kann.

    – robertklep

    20. Februar 2015 um 9:52 Uhr

  • Sie können das Schema für die verschiedenen Modelle und damit DBs freigeben. var newSchema = new mongoose.Schema({ ... }), var model2 = conn1.model('newModel', newSchema), var model2 = conn2.model('newModel', newSchema)

    – gewähren

    6. Dezember 2016 um 20:33 Uhr


Ziemlich spät, aber das könnte jemandem helfen. Die aktuellen Antworten gehen davon aus, dass Sie dieselbe Datei für Ihre Verbindungen und Modelle 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:

mongoose.connect('mongodb://localhost/default');

const db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  console.log('connected');
});

das ist genau so, wie es in den Dokumenten beschrieben ist. Führen Sie dann in Ihren Modelldateien Folgendes aus:

import mongoose, { Schema } from 'mongoose';

const userInfoSchema = new Schema({
  createdAt: {
    type: Date,
    required: true,
    default: new Date(),
  },
  // ...other fields
});

const myDB = mongoose.connection.useDb('myDB');

const UserInfo = myDB.model('userInfo', userInfoSchema);

export default UserInfo;

Wobei myDB Ihr Datenbankname ist.

  • Vielen Dank – ich konnte 3 verschiedene Datenbanken in einer einzigen Anwendung verwenden mit: const mongoose = require(‘mongoose’); const Schema = Mungo.Schema; const mySchema = neues Schema ({}); const mydbvar = mongoose.connection.useDb(‘mydb’) module.exports = mydbvar.model(‘myCollection’, MySchema);

    – Johnathan Enslin

    26. Juni 2018 um 14:21 Uhr

  • Definitiv das beste und realistischste Beispiel. Stellen Sie eine Verbindung zur Standarddatenbank her (genauso, als ob Sie etwas wie SQL Server verwenden würden) und nutzen Sie dann useDb, um Ihre DML auf die entsprechende Datenbank auszurichten. (Sehr hilfreich, um Ihre Benutzer in einer Datenbank und Ihre Daten in einer anderen zu halten.) Sie müssen nicht mehrere Verbindungen herstellen, wenn Sie letztendlich Anforderungen an denselben Server senden. Wenn Sie sich nun mit zwei verschiedenen Servern verbinden, ist das eine andere Sache.

    – Newclique

    10. September 2018 um 21:01 Uhr


  • Wie @Wade sagte, funktioniert diese Lösung meines Wissens nur, wenn sich alle Datenbanken auf demselben Server befinden. Es ist nicht klar, ob dies die Frage des OP beantwortet, und IMO ist ein bisschen irreführend.

    – Joniba

    15. Januar 2019 um 16:31 Uhr


  • Das ist genau das, was ich für die Migration von MongoDB Atlas benötigt habe test, und auch um mehrere Verbindungen zu vermeiden. Ich allerdings auch .db Am Ende (const v1 = mongoose.connection.useDb('test').db), da die alte Datenbank nicht von Mungo verwaltet werden muss.

    – Polv

    26. Juli 2020 um 9:48 Uhr

  • Scheint großartig zu sein, wenn sich Datenbanken auf demselben Server befinden … Gibt es einen ähnlichen Ansatz, wenn sich Datenbanken auf verschiedenen Hosts befinden?

    – Mikel

    16. Januar um 17:45 Uhr

Mongoose und mehrere Datenbanken in einem einzelnen nodejs Projekt
gelb

Eine Sache, die Sie tun können, ist, dass Sie möglicherweise Unterordner für jedes Projekt haben. Installieren Sie also Mongoose in diesen Unterordnern und require() Mongoose aus eigenen Ordnern in jeder Unteranwendung. Nicht vom Projektstamm oder von global. Also ein Unterprojekt, eine Mungo-Installation und eine Mungo-Instanz.

-app_root/
--foo_app/
---db_access.js
---foo_db_connect.js
---node_modules/
----mongoose/
--bar_app/
---db_access.js
---bar_db_connect.js
---node_modules/
----mongoose/

In foo_db_connect.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/foo_db');
module.exports = exports = mongoose;

In bar_db_connect.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/bar_db');
module.exports = exports = mongoose;

In db_access.js-Dateien

var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app

Jetzt können Sie mit Mongoose auf mehrere Datenbanken zugreifen.

  • Das bedeutet, dass jedes Projekt seine eigene Verbindung hat. Sie können keine 100.000 Verbindungen verwalten. Ich denke, es wäre besser zu verwenden useDb Befehl, der denselben Verbindungspool verwendet.

    – xpermint

    29. November 2015 um 9:49 Uhr

  • xpepermint können Sie ein Beispiel für useDb zeigen – ich habe dieses Problem derzeit stackoverflow.com/questions/37583198/…

    – Lion789

    2. Juni 2016 um 7:15 Uhr

  • Das sieht nach einer enormen Belastung für das Projekt aus. meinst du nicht?

    – Eshwar Prasad Yaddanapudi

    2. August 2016 um 1:44 Uhr

  • Ein paar verschiedene Verbindungsinstanzen (z. B. für eine Benutzer-DB, eine Sitzungs-DB und für Anwendungsdaten) pro Anwendung zu haben, ist völlig in Ordnung. Es ist keine “große Belastung” oder wird Skalierungsprobleme verursachen und ist ein häufiger Anwendungsfall.

    – Iain Collins

    25. Juli 2017 um 15:44 Uhr

  • Du bist der Beste mein Freund! Vielen Dank! Für mich geht das! Danke!

    – Biruel Rick

    13. Februar 2019 um 19:29 Uhr

Als alternativen Ansatz exportiert Mongoose einen Konstruktor für eine neue Instanz auf der Standardinstanz. Also sowas ist möglich.

var Mongoose = require('mongoose').Mongoose;

var instance1 = new Mongoose();
instance1.connect('foo');

var instance2 = new Mongoose();
instance2.connect('bar');

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 erstellt werden können. Stellen Sie sicher, dass disconnect() aufgerufen wird, wenn Instanzen nicht benötigt werden, und um auch die von jeder Instanz erstellte Poolgröße zu begrenzen.

Eine etwas optimierte (zumindest für mich) Lösung. Schreiben Sie dies in eine Datei db.js und fordern Sie dies an, wo immer es erforderlich ist, und rufen Sie es mit einem Funktionsaufruf auf, und Sie können loslegen.

   const MongoClient = require('mongodb').MongoClient;
    async function getConnections(url,db){
        return new Promise((resolve,reject)=>{
            MongoClient.connect(url, { useUnifiedTopology: true },function(err, client) {
                if(err) { console.error(err) 
                    resolve(false);
                }
                else{
                    resolve(client.db(db));
                }
            })
        });
    }

    module.exports = async function(){
        let dbs      = [];
        dbs['db1']     = await getConnections('mongodb://localhost:27017/','db1');
        dbs['db2']     = await getConnections('mongodb://localhost:27017/','db2');
        return dbs;
    };

  • Wie kann ich auf diese Weise ein Modal erstellen?

    – Muhammad Usmann

    2. Mai 2021 um 13:37 Uhr


Mongoose und mehrere Datenbanken in einem einzelnen nodejs Projekt
Prana

Mongoose und mehrere Datenbanken in einem einzelnen node.js-Projekt

verwenden useDb um dieses Problem zu lösen

Beispiel

//product databse 
const myDB = mongoose.connection.useDb('product');
module.exports = myDB.model("Snack", snackSchema);
//user databse
const myDB = mongoose.connection.useDb('user');
module.exports = myDB.model("User", userSchema);

  • Wie kann ich auf diese Weise ein Modal erstellen?

    – Muhammad Usmann

    2. Mai 2021 um 13:37 Uhr


916060cookie-checkMongoose und mehrere Datenbanken in einem einzelnen node.js-Projekt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy