我有三个模特,
modelA,modelB和ModelC
ModelC的数据在这里
ModelC.find({})
.populate({ path: 'RefId', model: 'modelA' })
.populate({ path: 'RefId', model: 'modelB' })
如何为ModelC编写填充查询,以填充 RefId 。
它应该填充 RefModel 引用的modelA或modelB。
我已经尝试了
new mongoose.Schema({
RefModel: String,
RefId:{ type: Schema.ObjectId}});
但只采用最后一种模式。
modelC架构。
x
我可以用聚合来做,但更喜欢填充。
答案 0 :(得分:0)
数据库和架构中的字段名称非常混乱,让我解释一下更清晰的例子。
假设您有3个模型:用户,文章和评论。文章和评论仅属于单个用户。用户可以有多个评论和文章(如您在示例中所示)。
id
存储在用户模型中,如: comments: [{ id: '..', ref: Comment }],
articles: [{ id: '..', ref: Article }]
并填充您的文档:
User.find({})
.populate('comments')
.populate('articles');
user: { id: '...', ref: User }
并使用mongoose-reverse-populate模块进行填充,例如注释模型:
var reversePopulate = require('mongoose-reverse-populate');
User.find().exec(function(err, users) {
var opts = {
modelArray: users,
storeWhere: "comments",
arrayPop: true,
mongooseModel: Comments,
idField: "user"
}
reversePopulate(opts, function(err, popUsers) {
// populated users will be populated with comments under .comments property
});
});
此外,您不需要将RefModel保留在数据库中,仅在模式中。
答案 1 :(得分:0)
在这里,你可以尝试在find本身的回调中填充它。
试试这个:
ModelC.find({}).exec(function(err,modelC){
//find returns an array of Object, you will have to populate each Object individually.
var modelCObjects =[];
modelC.forEach(function(tempModelC){
//populate via the Model
ModelC.populate(tempModelC,{path : tempModelC.refId , model :tempModelC.refModel},function(err2,newModelC){
//handle newModelC however you want
//Push it into array of modelC Objects
modelCObjects.push(newModelC);
});
//OR
//Populate directly on the resultObject <-im not so sure about this
tempModelC.populate({path : tempModelC.refId , model :tempModelC.refModel},function(err2,newModelC){
//Push it into array of modelC Objects
modelCObjects.push(newModelC);
})
});
//here you have modelCObjects -> Array of populated modelC Objects
});
请务必处理错误。