2015-12-05 24 views
0

我正在测试一个想法,并为讨论做了一些人为的示例。mongoosejs:从不同模式中填充objectId的数组

我有以下模式的型号:

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); 

我已经成功地推动每一项以蒙戈的例子。这导致了三个集合了REFD阵列,其中包括innerOne和innerTwo对象的ObjectId的,从蒙戈的观点看起来不错:

{ 
    "_id" : ObjectId("56625b7c752995f505637864"), 
    "title" : "LOOK AT MY CHILDREN!", 
    "refD" : [ 
     ObjectId("56625b7c752995f505637862"), 
     ObjectId("56625b7c752995f505637863") 
    ], 
    "__v" : 1 
} 

然而,当我使用填充命令像这样:

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 } 

所以这个结构却是正确的,它看起来好像填入功能只填入第一两个TY的PES。

我在推行什么可以执行的限制,还是有办法处理不同对象的人口?

我曾考虑过使用鉴别器来创建单个父类的所有模型子元素,但是我不希望如果这样做,我可能会使用关系数据库。

------编辑------ 在这一点上似乎并不像这是没有修改或创建一个插件是可行的。

对于任何人谁在想同样的事我现在决定回到更传统的方式,我创建了一个relatedRecordSchema,它存储一个Id和一个记录类型以及一些其他有用的元数据。这基本上推动了人口的逻辑到应用程序。

在我的使用案例中,这并不是那么糟糕,因为我并不总是想要填充所有各种相关记录,而是让应用程序或用户即时决定。

这不是一个答案,所以我会离开的问题打开希望有人采取主动,并建立一个插件;)

干杯 乙

回答

0

据我所知,填充一个模式的作品。通过给出不同的模型参数,你可以尝试运行两次到'refD'的填充。有关填入

的更多信息: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); 
}); 
+0

嗯。不幸的是,这不起作用,无论哪个人群中第二个出现在阵列中都是独一无二的。所以看起来你可以在你喜欢的地方推出尽可能多的模型,但一次只能填充一个模型。我会继续玩。谢谢 – delProfundo