我正在测试一个想法并制作了一些人为的例子供讨论。
我有以下架构的模型:
var outerSchema = new Schema({
title: String,
refD: [{type: Schema.ObjectId, ref: 'InnerOne'},
{type: Schema.ObjectId, ref: 'InnerTwo'}]
});
var innerOneSchema = new Schema({
title: String
});
var innerTwoSchema = new Schema({
turtle:String
});
var Outer = mongoose.model('Outer', outerSchema);
var InnerOne = mongoose.model('InnerOne', innerOneSchema);
var InnerTwo = mongoose.model('InnerTwo', innerTwoSchema);
我已成功将其中一个示例推送到Mongo。这导致了三个带有refD数组的集合,其中包含innerOne和innerTwo对象的ObjectId,从mongo的角度看起来很好:
{
"_id" : ObjectId("56625b7c752995f505637864"),
"title" : "LOOK AT MY CHILDREN!",
"refD" : [
ObjectId("56625b7c752995f505637862"),
ObjectId("56625b7c752995f505637863")
],
"__v" : 1
}
但是当我使用populate命令时:
Outer
.findOne({title: 'LOOK AT MY CHILDREN!'})
.populate('refD')
.exec(function(err,res){
if(err) console.log(err);
console.log(res);
});
结果如下:
{ refD:
[ { __v: 0,
title: 'Im the first type inside!',
_id: 56625b7c752995f505637862 } ],
__v: 1,
title: 'LOOK AT MY CHILDREN!',
_id: 56625b7c752995f505637864 }
结构上这是正确的,但看起来populate函数只填充了两种类型中的第一种。
我是在推动可以执行的限制还是有办法处理不同对象的数量?
我曾考虑使用鉴别器来使所有模型成为单个父类的子项但我不愿意,如果我这样做,我也可以使用关系数据库。
------ ------ EDIT 在这一点上,如果不修改或创建插件,它似乎是不可行的。
对于那些正在思考我现在所做的同样事情的人,我会回到更传统的方法,我已经创建了一个相关的RecordSchema,它存储了Id和记录类型以及一些其他有用的元数据。这实际上将人口的逻辑推向应用程序。
在我的用例中,这并不是很糟糕,因为我并不总是希望填充所有各种相关记录,而是让应用程序或用户即时决定。
这不是一个答案所以我会留下问题,希望有人采取主动并建立一个插件;)
干杯 乙
答案 0 :(得分:0)
据我所知,填充一个架构的作品。您可以尝试将填充运行两次到“反馈”中。通过给出不同的模型参数。
有关populate的更多信息:Mongoose populate
我没有通过测试,但可能的方法来解决这个问题:
Outer
.findOne({title: 'LOOK AT MY CHILDREN!'})
.populate({
path: 'refD',
model: 'InnerOne'
})
.populate({
path: 'refD',
model: 'InnerTwo'
})
.exec(function(err,res){
if(err) console.log(err);
console.log(res);
});