Je fais un projet Node.js qui contient des sous-projets. Un sous-projet aura une base de données Mongodb et Mongoose sera utilisé pour encapsuler et interroger db. Mais le problème est
- Mongoose ne permet pas d'utiliser plusieurs bases de données dans une seule instance de mangouste car les modèles sont construits sur une seule connexion.
Pour utiliser plusieurs instances de mangouste, Node.js n'autorise pas plusieurs instances de module car il dispose d'un système de mise en cache
require()
. Je sais désactiver la mise en cache du module dans Node.js mais je pense que ce n'est pas la bonne solution car il ne s'agit que de mangouste.J'ai essayé d'utiliser
createConnection()
etopenSet()
en mangouste, mais ce n'était pas la solution.J'ai essayé de copier en profondeur l'instance de mangouste ( http://blog.imaginea.com/deep-copy-in-javascript/ ) pour transmettre de nouvelles instances de mangouste au sous-projet, mais cela lance
RangeError: Maximum call stack size exceeded
.
Je veux savoir est-il possible d'utiliser plusieurs bases de données avec mangouste ou une solution de contournement pour ce problème? Parce que je pense que la mangouste est assez facile et rapide. Ou d'autres modules comme recommandations?
useDb
commande qui utilise le même pool de connexion.Selon le manuel fin ,
createConnection()
peut être utilisé pour se connecter à plusieurs bases de données.Cependant, vous devez créer des modèles distincts pour chaque connexion / base de données:
Je suis presque sûr que vous pouvez partager le schéma entre eux, mais vous devez vérifier pour vous en assurer.
la source
useDb()
disponible dans la version 3.8 pour partager le pool de connexions sous-jacent: github.com/LearnBoost/mongoose/wiki/…var newSchema = new mongoose.Schema({ ... })
,var model2 = conn1.model('newModel', newSchema)
,var model2 = conn2.model('newModel', newSchema)
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:
ce qui est juste comme cela est décrit dans la documentation. Et puis dans vos fichiers de modèle, faites quelque chose comme ceci:
Où myDB est le nom de votre base de données.
la source
test
, et aussi pour éviter d'avoir plusieurs connexions. Cependant, j'ai aussi.db
à la fin (const v1 = mongoose.connection.useDb('test').db
) car l'ancienne base de données n'a pas besoin d'être gérée par mangouste.Comme approche alternative, Mongoose exporte un constructeur pour une nouvelle instance sur l'instance par défaut. Donc, quelque chose comme ça est possible.
Ceci est très utile lorsque vous travaillez avec des sources de données distinctes, et également lorsque vous souhaitez avoir un contexte de base de données distinct pour chaque utilisateur ou requête. Vous devrez faire attention, 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.
la source
await instance1.connection.collection('foo').insert({ foo: 'bar', }) await instance2.connection.collection('foo').insert({ foo: 'zoo', })
Une solution un peu optimisée (pour moi au moins). écrivez ceci dans un fichier db.js et exigez-le partout où c'est nécessaire et appelez-le avec un appel de fonction et vous êtes prêt à partir.
la source