mongoosejs:从不同的模式填充一个objectId数组

时间:2015-12-05 04:04:24

标签: mongodb mongoose

我正在测试一个想法并制作了一些人为的例子供讨论。

我有以下架构的模型:

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和记录类型以及一些其他有用的元数据。这实际上将人口的逻辑推向应用程序。

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

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

干杯 乙

1 个答案:

答案 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);
});