2015-11-05 112 views
0

這個問題是類似於貓鼬架構:this question如何引用已尚未註冊

與貓鼬的工作,我有一些像下面的代碼。 (我用數字前綴了文件,所以我可以按照它們出現在「模型」目錄中的順序加載它們,但仍然控制加載順序。)

在100-employee.server.model.js中:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var EmployeeSchema = new Schema({ 
    name: { 
    type: String, 
    default: '' 
    }, 
    company: { 
    type: Schema.ObjectId, 
    ref: 'Company' 
    }, 
    subordinates: [EmployeeSchema], 
}); 
mongoose.model('Employee', EmplyeeSchema); 

然後,在200公司server.js,我有:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var CompanySchema = new Schema({ 
    name: { 
    type: String, 
    default: '' 
    }, 
    CEO: { 
    type: Schema.ObjectId, 
    ref: 'Employee' 
    } 
}); 
mongoose.model('Company', CompanySchema); 

顯然,這是不行的,因爲它是註冊公司之前引用。而且,以相反的順序加載這些文件也不會出於同樣的原因。我需要的,就像是一個邏輯數據結構:

{ 
    name: 'Acme, Inc', 
    CEO: { 
    name: 'Karen', 
    subordinates: [{ 
     name: 'Bob', 
     subordinates: [{ 
     name: 'Lisa', 
     subordinates: [] 
     }, 
     name: 'Jerry', 
     subordinates: [] 
     }] 
    }] 
    } 
} 

(我想我得到了我所有的括號內的地方,我剛纔輸入的是JSON說明的必要。)

我可以只使用一個EmployeeSchema中'公司'的ObjectId,但它不能解決問題。我仍然收到公司尚未註冊的投訴。

有人會問的使用情況,所以在這裏它是:

我有一堆companies.I有一個公司的僱員的層次結構。而且,我有很多公司。對於每家公司,我都需要了解首席執行官,而不必搜索我的所有員工,找到沒有父母的員工,該公司擁有ObjectId ref公司,但這仍然會遇到同樣的問題。

有什麼建議嗎?

回答

0

好的,我已經想出了一個答案,或者至少是一種解決方法。不覺得很優雅。事實上,我積極不喜歡它,但它的工作原理。很樂意看到更好的解決方案。在100公司server.js,首先定義父實體,像這樣:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var CompanySchema = new Schema({ 
    name: { 
    type: String, 
    default: '' 
    }, 
    CEO: { 
    name: { // This is the company name, so probably a bad example 
     type: String, 
     default: '' 
    }, { 
     shoeSize: Number 
    }, etc ... 
    } 
}); 
mongoose.model('Company', CompanySchema); 

這裏要注意的關鍵一點是,而不是把CEO的的ObjectId裁判「僱員」我提供一個使用一個對象與我的Employee模式相同的屬性。根據您想要如何使用它,您可能必須將其強制轉換爲控制器中的Employee對象。或者,可能有一種聰明的方式來使用虛擬來做同樣的事情(http://mongoosejs.com/docs/guide.html)但是,虛擬只需要在EmployeeSchema和model之後定義。

在200 employee.server.js,類似如下:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    CompanySchema = mongoose.model('Company').schema; // so you can use this 
                // after your Employee 
                // is defined 

var EmployeeSchema = new Schema({ 
    name: { 
    type: String, 
    default: '' 
    }, 
    company: { 
    type: Schema.ObjectId, 
    ref: 'Company' 
    }, 
    subordinates: [], // Just an empty array. You fill it with Employees in the controller. You could use a virtual to do the same thing, probably. 
}); 

mongoose.model('Employee', EmployeeSchema); 

因此,它是一種醜陋,但它的工作原理。

要點:

  • 在定義CompanySchema,你不使用的ObjectId裁判 '僱員'。
  • 而是定義一個看起來像公司對象的對象。
  • 由於此對象沒有_id,因此您必須在 控制器中解決該問題。在我的情況下,這工作正常。但是,對於很多/大多數情況下,這個 可能不會。你必須通過巧妙的虛擬工具 和/或控制器來解決這個問題。
  • 使用一個簡單的數組,沒有類型來存儲你的孩子(suborinates在 這個例子。 數組工作得很好,並返回就像您使用的ObjectId參考員工的數組 對象。
  • 使公司是指員工(尚未定義), 必須將一個通用對象轉換爲一個Employee對象。但是,有 許多方法來做到這一點。
  • 毫無疑問,有一個更好的方法要做到這一點。
相關問題