
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.
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.

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.
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;
};

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);
9160600cookie-checkMongoose und mehrere Datenbanken in einem einzelnen node.js-Projektyes