Я делаю проект Node.js, который содержит подпроекты. Один подпроект будет иметь одну базу данных Mongodb, а Mongoose будет использоваться для упаковки и запросов к базе данных. Но проблема в том
- Mongoose не позволяет использовать несколько баз данных в одном экземпляре mongoose, поскольку модели строятся на одном соединении.
Чтобы использовать несколько экземпляров mongoose, Node.js не позволяет использовать несколько экземпляров модуля, поскольку в нем есть система кеширования
require()
. Я знаю, что отключить кеширование модулей в Node.js, но я думаю, что это не лучшее решение, так как оно нужно только для мангуста.Я пробовал использовать
createConnection()
иopenSet()
в мангусте, но это не было решением.Я попытался глубоко скопировать экземпляр мангуста ( http://blog.imaginea.com/deep-copy-in-javascript/ ), чтобы передать новые экземпляры мангуста в подпроект, но он бросил
RangeError: Maximum call stack size exceeded
.
Я хочу знать, есть ли способы использовать несколько баз данных с мангустом или какое-либо решение этой проблемы? Потому что я считаю, что мангуст довольно простой и быстрый. Или любые другие модули в качестве рекомендаций?
useDb
команду, которая использует тот же пул соединений.Согласно прекрасному руководству ,
createConnection()
может использоваться для подключения к нескольким базам данных.Однако вам необходимо создать отдельные модели для каждого соединения / базы данных:
Я почти уверен, что вы можете поделиться схемой между ними, но вы должны проверить, чтобы убедиться.
источник
useDb()
в 3.8 доступна проверка для совместного использования базового пула соединений: github.com/LearnBoost/mongoose/wiki/…var newSchema = new mongoose.Schema({ ... })
,var model2 = conn1.model('newModel', newSchema)
,var model2 = conn2.model('newModel', newSchema)
Довольно поздно, но это может кому-то помочь. Текущие ответы предполагают, что вы используете один и тот же файл для своих подключений и моделей.
В реальной жизни высока вероятность того, что вы разбиваете свои модели на разные файлы. Вы можете использовать что-то вроде этого в своем основном файле:
как это описано в документации. А затем в файлах модели сделайте что-то вроде следующего:
Где myDB - имя вашей базы данных.
источник
test
, а также для предотвращения множественных подключений. Тем не менее, я также.db
в end (const v1 = mongoose.connection.useDb('test').db
), поскольку старый db не требует управления мангустом.В качестве альтернативного подхода Mongoose экспортирует конструктор для нового экземпляра в экземпляр по умолчанию. Так что что-то подобное возможно.
Это очень полезно при работе с отдельными источниками данных, а также когда вы хотите иметь отдельный контекст базы данных для каждого пользователя или запроса. Вам нужно будет быть осторожным, так как при этом можно создать МНОГО подключений. Обязательно вызывайте disconnect (), когда экземпляры не нужны, а также ограничивайте размер пула, создаваемого каждым экземпляром.
источник
await instance1.connection.collection('foo').insert({ foo: 'bar', }) await instance2.connection.collection('foo').insert({ foo: 'zoo', })
Немного оптимизированное (по крайней мере для меня) решение. напишите это в файл db.js и потребуйте его там, где это необходимо, и вызовите его с помощью вызова функции, и все готово.
источник