Estou fazendo um projeto Node.js que contém subprojetos. Um subprojeto terá um banco de dados Mongodb e o Mongoose será usado para agrupar e consultar o banco de dados. Mas o problema é
- O Mongoose não permite usar vários bancos de dados em uma única instância de mangusto, pois os modelos são construídos em uma conexão.
Para usar várias instâncias de mangusto, o Node.js não permite várias instâncias de módulo, pois possui o sistema de cache
require()
. Eu sei desativar o cache do módulo no Node.js, mas acho que não é a boa solução, pois é apenas necessário para o mangusto.Eu tentei usar
createConnection()
eopenSet()
em mangusto, mas não era a solução.Tentei copiar profundamente a instância do mangusto ( http://blog.imaginea.com/deep-copy-in-javascript/ ) para passar novas instâncias do mangusto para o subprojeto, mas está sendo lançada
RangeError: Maximum call stack size exceeded
.
Eu quero saber se há alguma maneira de usar vários bancos de dados com mangusto ou alguma solução alternativa para esse problema? Porque acho que o mangusto é bem fácil e rápido. Ou quaisquer outros módulos como recomendações?
useDb
comando que usa o mesmo pool de conexão.De acordo com o manual ,
createConnection()
pode ser usado para conectar-se a vários bancos de dados.No entanto, você precisa criar modelos separados para cada conexão / banco de dados:
Tenho certeza de que você pode compartilhar o esquema entre eles, mas é necessário verificar para ter certeza.
fonte
useDb()
disponível em 3.8 para compartilhar o pool de conexão subjacente: github.com/LearnBoost/mongoose/wiki/...var newSchema = new mongoose.Schema({ ... })
,var model2 = conn1.model('newModel', newSchema)
,var model2 = conn2.model('newModel', newSchema)
Muito tarde, mas isso pode ajudar alguém. As respostas atuais assumem que você está usando o mesmo arquivo para suas conexões e modelos.
Na vida real, há uma grande chance de você estar dividindo seus modelos em arquivos diferentes. Você pode usar algo parecido com isto em seu arquivo principal:
que é exatamente como é descrito nos documentos. E então nos arquivos de modelo, faça algo como o seguinte:
Onde myDB é o nome do seu banco de dados.
fonte
test
e também para evitar ter várias conexões. No entanto, eu também.db
no final (const v1 = mongoose.connection.useDb('test').db
), pois o banco de dados antigo não precisa ser gerenciado pelo mangusto.Como uma abordagem alternativa, o Mongoose exporta um construtor para uma nova instância na instância padrão. Então, algo assim é possível.
Isso é muito útil ao trabalhar com fontes de dados separadas e também quando você deseja ter um contexto de banco de dados separado para cada usuário ou solicitação. Você precisará ter cuidado, pois é possível criar muitas conexões ao fazer isso. Certifique-se de chamar o método desconectar () quando as instâncias não forem necessárias e também limitar o tamanho do pool criado por cada instância.
fonte
await instance1.connection.collection('foo').insert({ foo: 'bar', }) await instance2.connection.collection('foo').insert({ foo: 'zoo', })
Uma solução um pouco otimizada (pelo menos para mim). grave isso em um arquivo db.js e exija isso sempre que necessário e chame-o com uma chamada de função e você estará pronto.
fonte