猫鼬,阵列模型上的深度人口
Mongoose, Deep Population on array model
我想深入填充一个可能过于复杂的模型
var ParentSchema = new Schema({
childs: [{type:Schema.ObjectId, ref: 'Child'}],
});
var ChildSchema = new Schema({
subject: [{
price: {type: Number},
data: {type: Schema.ObjectId, ref: 'Subject'}
}]
})
但是,当我使用常规人口时,它似乎不起作用。我现在安装了 deep-populate 并使用以下内容:
Parent.deepPopulate('childs.subjects');
我想知道是否有更简单的方法来完成一组填充的主题。
mongoose-deep-populate 插件可以解决这个问题,但您需要使用正确的路径到达您想要填充的最深字段。在这种情况下,查询应如下所示:
Parent.findOne().deepPopulate('childs.subject.data').exec(function(err, parents) {...});
但是,重要的是要认识到这使用多个查询(每个人口级别至少一个查询)来执行人口。首先是 Parent
查询,然后是 Child
查询,然后是 Subject
查询。因此,最好尽可能嵌入相关数据,但如果您需要独立查询子数据和主题数据,那是不切实际的。因此,如果您需要将相关文档放在单独的集合中,填充是正确的选择。
有关更多信息和指导,请参阅 data modeling 上的文档部分。
如果您不想使用 deepPopulate 插件,您可以通过 2 次完成:
填充child
填充subject.data
它将生成 3 个请求(一个用于 Parent,一个用于 Child,一个用于 Subject),就像 deepPopulate 插件所做的那样:
query = Parent.findOne().populate('childs');
query.exec(function(err, parent) {
if (err) {
//manage error
};
// now we need to populate all childs with their subject
Child.populate(parent.childs, {
path: 'subject.data',
model: 'Subject'
},function(err){
// parent object is completely populated
});
});
我想深入填充一个可能过于复杂的模型
var ParentSchema = new Schema({
childs: [{type:Schema.ObjectId, ref: 'Child'}],
});
var ChildSchema = new Schema({
subject: [{
price: {type: Number},
data: {type: Schema.ObjectId, ref: 'Subject'}
}]
})
但是,当我使用常规人口时,它似乎不起作用。我现在安装了 deep-populate 并使用以下内容:
Parent.deepPopulate('childs.subjects');
我想知道是否有更简单的方法来完成一组填充的主题。
mongoose-deep-populate 插件可以解决这个问题,但您需要使用正确的路径到达您想要填充的最深字段。在这种情况下,查询应如下所示:
Parent.findOne().deepPopulate('childs.subject.data').exec(function(err, parents) {...});
但是,重要的是要认识到这使用多个查询(每个人口级别至少一个查询)来执行人口。首先是 Parent
查询,然后是 Child
查询,然后是 Subject
查询。因此,最好尽可能嵌入相关数据,但如果您需要独立查询子数据和主题数据,那是不切实际的。因此,如果您需要将相关文档放在单独的集合中,填充是正确的选择。
有关更多信息和指导,请参阅 data modeling 上的文档部分。
如果您不想使用 deepPopulate 插件,您可以通过 2 次完成:
填充child
填充subject.data
它将生成 3 个请求(一个用于 Parent,一个用于 Child,一个用于 Subject),就像 deepPopulate 插件所做的那样:
query = Parent.findOne().populate('childs');
query.exec(function(err, parent) {
if (err) {
//manage error
};
// now we need to populate all childs with their subject
Child.populate(parent.childs, {
path: 'subject.data',
model: 'Subject'
},function(err){
// parent object is completely populated
});
});