Node.js 如何引用没有';我还没注册呢
这个问题类似于: 使用猫鼬,我有如下代码。(我用数字作为文件的前缀,因此我可以按照它们在“models”目录中出现的顺序加载它们,但仍然可以控制加载顺序。) 在100-employee.server.model.js中:Node.js 如何引用没有';我还没注册呢,node.js,mongodb,mongoose,mean,Node.js,Mongodb,Mongoose,Mean,这个问题类似于: 使用猫鼬,我有如下代码。(我用数字作为文件的前缀,因此我可以按照它们在“models”目录中出现的顺序加载它们,但仍然可以控制加载顺序。) 在100-employee.server.model.js中: var mongoose = require('mongoose'), Schema = mongoose.Schema; var EmployeeSchema = new Schema({ name: { type: String, default:
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-company-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中使用“company”的ObjectId,但它不能解决这个问题。我仍然接到一个投诉,说这家公司还没有注册
有人会询问用例,所以这里是:
我有很多公司,我有一个公司的员工等级制度。而且,我有很多公司。对于每一家公司,我都需要了解CEO,而不必搜索我所有的员工,寻找一家没有母公司的公司,这家公司有ObjectId ref公司,但仍然会遇到同样的问题
有什么建议吗?好的,我已经想出了一个答案,或者至少是一个解决办法。感觉不太优雅。事实上,我非常不喜欢它,但它确实有效。希望看到更好的解决方案。在100-company-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 ref'Employee',而是提供了一个与我的Employee模式使用相同属性的对象。根据您希望如何使用它,您可能必须将其强制为控制器中的Employee对象。或者,可能有一种聪明的方法可以使用虚拟机来做同样的事情(),但是,虚拟机只需要在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 ref“Employee”
- 而是定义一个看起来像公司对象的对象李>
- 因为这个对象没有_id,所以必须在 控制器。就我而言,这很好用。但是,对于许多/大多数用例来说 可能不会。你必须用聪明的虚拟人来解决这个问题 和/或控制器李>
- 使用一个不带类型的简单数组来存储子对象(子对象) 这个例子。 该数组工作正常,返回对象就像使用数组一样 ObjectId ref雇员的
- 让公司引用一名员工(尚未定义),您 必须将泛型对象转换为Employee对象 有很多方法可以做到这一点
- 毫无疑问,有一种更好的方法可以做到这一点