2015-02-07 45 views
0

我有2個模式:客戶和地址。由於其他原因,地址架構必須先註冊。 如何在地址架構中的靜態內的客戶表上執行查詢?貓鼬工作到沒有模式註冊

我想我需要訪問原始mongo驅動程序並使用它執行查詢 - 我不需要任何特殊的Mongoose驗證/中間件,因此這不是問題。

如何使用Customer模型中的本機驅動程序訪問Address表?還是有一種純粹的貓鼬做這種做法?請注意,O不想在Customer表中創建用於處理和使用總體的參考。

+1

一般地址將被包含在客戶文件內。沒有必要引用不同的文檔,這不是一個SQL數據庫。 – 2015-02-07 00:43:52

+0

我不是要求連接或模式佈局 - 我需要調用另一個模式,由於技術原因,不能先註冊。 – cyberwombat 2015-02-07 01:05:35

回答

0

您只需要從customer.js模型訪問Address模型。

//Customer.js 

var Address = require('./models/Address'); 

CustomerSchema = new mongoose.Schema({ 
    addresses: [{type: mongoose.Schema.ObjectId, ref:'Address'}] 
}); 

CustomerSchema.statics.getAddressById = function getAddressById (id, next) { 
    Customer.findOne({_id: id}, function (err, customer) { 
     if (err || !customer) { 
      return next(err || new Error('Customer not found with id' + id)); 
     } 

     Address.find({_id: {$in : customer.addresses}}, next); 
    }); 
} 

var Customer = db.model('Customer', CustomerSchema); 
module.exports = Customer; 

我假設您的客戶架構有一個addresses密鑰,它是一組地址。如果情況並非如此,請隨時將其更改爲單個地址。

+0

地址架構還沒有註冊(即沒有db.model('地址',地址。我一次加載一次註冊所有模式,因爲你只能需要一次模型。這也不是一個參考問題。只是試圖避免只是爲了調用另一個模型而在模型中包裝了一個包裝,但我可能需要 – cyberwombat 2015-02-07 02:02:48

+0

您可以根據需要隨意調用模型,節點緩存它的需求,因此它不會每隔一次就重新實例化一個新模型你需要它的時候需要Address寄存器Address模型如果你不想使用它,使用mongodb本地驅動程序,並執行db.addresses.find({_ id:{$ in:customer.addresses})} – 2015-02-07 02:09:24

+0

這是一個最近的變化嗎?過去的Mongoose沒有允許這樣做 - 創建多個註冊問題,爲了避免無盡的錯誤,我必須將所有的貓鼬模型加載到一個地方,這是一個衆所周知的問題,例如:http: //stackoverflow.com/questions/17277683/call-require-on-mongoos e-model-more-once – cyberwombat 2015-02-07 02:14:59

0

好的。我能夠通過更改我撥打var Customer = mongoose.model('Customer')電話的位置來解決我的問題。將其放在我的Address模型的頂部並與其他所有需要一起導致模式註冊錯誤。但把它放在靜態方法裏面的確有竅門。

所以:

AddressSchema.statics.myMethod = function() { 
    var Customer = mongoose.model('Customer');