187 votes

Mongoose et plusieurs bases de données dans un seul projet node.js

Je suis en train de réaliser un projet Node.js qui contient des sous-projets. Un sous-projet aura une base de données Mongodb et Mongoose sera utilisé pour envelopper et interroger la base de données. Mais le problème est

  • Mongoose ne permet pas d'utiliser plusieurs bases de données dans une seule instance de mongoose car les modèles sont construits sur une seule connexion.
  • Pour utiliser plusieurs instances de mongoose, Node.js ne permet pas de multiples instances de modules car il a un système de mise en cache dans require(). Je sais désactiver la mise en cache des modules dans Node.js mais je pense que ce n'est pas la bonne solution car cela n'est nécessaire que pour mongoose.

    J'ai essayé d'utiliser createConnection() et openSet() dans mongoose, mais ce n'était pas la solution.

    J'ai essayé de copier profondément l'instance de mongoose (http://blog.imaginea.com/deep-copy-in-javascript/) pour passer de nouvelles instances de mongoose au sous-projet, mais cela lance une erreur RangeError: Maximum call stack size exceeded.

Je veux savoir s'il existe des moyens d'utiliser plusieurs bases de données avec mongoose ou toute solution de contournement pour ce problème? Parce que je trouve que mongoose est assez facile et rapide. Ou d'autres modules à recommander?

271voto

robertklep Points 29669

Selon le manuel complet, createConnection() peut être utilisé pour se connecter à plusieurs bases de données.

Cependant, vous devez créer des modèles séparés pour chaque connexion/base de données :

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

// stocké dans la base de données 'testA'
var ModelA    = conn.model('Model', new mongoose.Schema({
  title : { type : String, default : 'modèle dans la base de données testA' }
}));

// stocké dans la base de données 'testB'
var ModelB    = conn2.model('Model', new mongoose.Schema({
  title : { type : String, default : 'modèle dans la base de données testB' }
}));

Je suis à peu près certain que vous pouvez partager le schéma entre eux, mais vous devez vérifier pour être sûr.

101voto

Tahnik Mustasin Points 692

Assez tard mais cela pourrait aider quelqu'un. Les réponses actuelles supposent que vous utilisez le même fichier pour vos connexions et modèles.

Dans la vraie vie, il y a de fortes chances que vous divisiez vos modèles en différents fichiers. Vous pouvez utiliser quelque chose comme ceci dans votre fichier principal :

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

const db = mongoose.connection;

db.on('error', console.error.bind(console, 'erreur de connexion :'));
db.once('open', () => {
  console.log('connecté');
});

ce qui est exactement comme décrit dans la documentation. Ensuite, dans vos fichiers de modèle, faites quelque chose comme ce qui suit :

import mongoose, { Schema } from 'mongoose';

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

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

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

export default UserInfo;

Où myDB est le nom de votre base de données.

52voto

yemaw Points 678

Une chose que vous pouvez faire est d'avoir des sous-dossiers pour chaque projet. Ainsi, installez mongoose dans ces sous-dossiers et require() mongoose à partir de ces propres dossiers dans chaque sous-application. Pas à partir de la racine du projet ou de manière globale. Donc un sous-projet, une installation de mongoose et une instance de mongoose.

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

Dans foo_db_connect.js

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

Dans bar_db_connect.js

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

Dans les fichiers db_access.js

var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js pour l'application bar

Maintenant, vous pouvez accéder à plusieurs bases de données avec mongoose.

49voto

Eric Points 540

Comme approche alternative, Mongoose exporte un constructeur pour une nouvelle instance sur l'instance par défaut. Donc quelque chose comme ceci est possible.

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

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

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

Ceci est très utile lorsque vous travaillez avec des sources de données séparées, et aussi lorsque vous voulez avoir un contexte de base de données séparé pour chaque utilisateur ou requête. Vous devrez être attentif, car il est possible de créer BEAUCOUP de connexions en faisant cela. Assurez-vous d'appeler disconnect() lorsque les instances ne sont pas nécessaires, et également de limiter la taille du pool créé par chaque instance.

7voto

surya raghul Points 77

Mongoose et plusieurs bases de données dans un seul projet node.js

utilisez useDb pour résoudre ce problème

exemple

//base de données produit
const myDB = mongoose.connection.useDb('product');
module.exports = myDB.model("Snack", snackSchema);
//base de données utilisateur
const myDB = mongoose.connection.useDb('user');
module.exports = myDB.model("User", userSchema);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X