mongoose填充对子文档的引用

时间:2015-05-16 19:42:50

标签: node.js mongodb mongoose

我找不到对我的问题的任何回应。可能也是一个搜索问题,但会感激一些帮助。 我有以下型号:

var ChildSchema =  new Schema ({
    'name': string
});
var ClassSchema =  new Schema ({
    'name': string, 
    'children': [ChildSchema] 
});

我只为类声明了一个模型。

mongoose.model ('Class', ClassSchema); 

然后我有另一个模型:

var TeacherSchema = new Schema ({
   'name': string, 
   'favorite': {type: ObjectId, ref: 'Class.children'} // a child from class children
   'least': {type: ObjectId, ref: 'Class.children'} // same as above
}); 

使用相关模型:

mongoose.model ('Teacher', TeacherSchema); 

我正在尝试按ID检索教师并填写子名称:

Teacher.findbyId (teacherId).populate (favorite least)... 

这似乎不起作用。这个建模是否正确?这可能吗?

(我知道我的例子在政治上可能不正确,所以请原谅我......)

修改 这是项目中某些事物的反映。我知道孩子们可以被建模为单独的集合,但在我的项目中,我更喜欢将它们保存为嵌入式文档(出于各种原因)。 当推入子数组并保存类时,每个子节点都会获得一个_id。教师需要指向“最喜欢”和“最少”的班级中的单个孩子,即保留该孩子的_id。

2 个答案:

答案 0 :(得分:1)

答案似乎是:不可行。 github.com/Automattic/mongoose/issues/2772 另外 - 找不到合适的插件。

答案 1 :(得分:0)

我有类似的问题。至少如果你有一个回到Child的Class的引用,这可能有效:

var TeacherSchema = new Schema ({
   'class': {type: ObjectId, ref: 'Class'}
   'name': string, 
   '_favorite': {type: ObjectId, ref: 'Class.children'} // a child from class children
   '_least': {type: ObjectId, ref: 'Class.children'} // same as above
}); 


TeacherSchema.virtual('favorite').get(function() {
  return this.class.children.id(this._favorite);
});
TeacherSchema.virtual('favorite').set(function(favorite) {
  this._favorite = favorite;
});

TeacherSchema.virtual('least').get(function() {
  return this.class.children.id(this._least);
});
TeacherSchema.virtual('least').set(function(least) {
  this._least = least;
});

TeacherSchema.set('toJSON', { getters: true, virtuals: true });

只要教师只有一个班级,这就有效。