2013-10-20 38 views
70

我在做一個包含子項目的Node.js項目。一個子項目將有一個Mongodb數據庫,Mongoose將用於包裝和查詢數據庫。但問題是單個node.js項目中的Mongoose和多個數據庫

  • 由於模型是在一個連接上構建的,因此Mongoose不允許在單個貓鼬情況下使用多個數據庫。
  • 要使用多個貓鼬實例,Node.js不允許多個模塊實例,因爲它具有高速緩存系統require()。我知道在Node.js中禁用模塊緩存,但我認爲這不是一個好的解決方案,因爲它只需要貓鼬。

    我試過在貓鼬中使用createConnection()openSet(),但這不是解決方案。

    我試過深拷貝貓鼬實例(http://blog.imaginea.com/deep-copy-in-javascript/)傳遞新的貓鼬實例到子項目,但它拋出RangeError: Maximum call stack size exceeded

我想知道是否有反正使用貓鼬或任何解決方法使用多個數據庫此問題?因爲我認爲貓鼬是相當容易和快速的。或者其他任何模塊作爲建議?

回答

17

你可以做的一件事是,你可能有每個項目的子文件夾。因此,在該子文件夾中安裝貓鼬,並在每個子應用程序中從自己的文件夾中需要()貓鼬。不是來自項目根目錄或來自全球。所以一個子項目,一個貓鼬安裝和一個貓鼬實例。

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

在foo_db_connect.js

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

在bar_db_connect.js

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

在db_access.js文件現在

var mongoose = require("./foo_db_connect.js"); // bar_db_connect.js for bar app 

,您可以訪問貓鼬多個數據庫。

+1

這意味着每個項目都有自己的連接。您將無法管理100k連接。我認爲使用'useDb'命令使用相同的連接池會更好。 – xpepermint

+0

xpepermint你能夠顯示一個useDb的例子 - 我目前有這個問題http://stackoverflow.com/questions/37583198/how-do-i-use-mongoose-to-connect-to-two-different -databases?noredirect = 1#comment62655639_37583198 – Lion789

+2

這看起來像是項目的巨大負擔。你不這麼認爲嗎? –

135

根據the fine manual,createConnection()可以使用連接到多個數據庫。

但是,你需要爲每個連接/數據庫中創建不同的模型:

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' } 
})); 

我敢肯定,你可以在它們之間共享的模式,但你必須檢查確認。

+3

是的,命名連接和共享模式是我想要的方式。按照羅伯特的例子,每個連接都需要一個獨特的模型。 –

+17

也檢出3.8中的'useDb()'以共享底層連接池:https://github.com/LearnBoost/mongoose/wiki/3.8-Release-Notes#connection-pool-sharing – aaronheckmann

+0

假設我有自動生成的數據庫(說n個數據庫)。不是一兩個。有沒有辦法連接到這些,而無需爲每個數據庫創建單獨的模型? –

10

作爲一種替代方法,Mongoose會在默認實例上爲新實例導出構造函數。所以這樣的事情是可能的。

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

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

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

這對於使用單獨的數據源以及您希望爲每個用戶或請求分別創建數據庫上下文時非常有用。你需要小心,因爲這樣做時可以創建很多連接。確保在不需要實例時調用disconnect(),並限制每個實例創建的池大小。

+1

是另一種寫['Above Answer']的方法(http://stackoverflow.com/ a/19475259/3050426)? – pravin

+3

這不是上述回答,它更好。上面的答案會不必要地安裝Mongoose的多個副本。 –

相關問題