【问题标题】:mongoosejs: populating an array of objectId's from different schemasmongoosejs:填充来自不同模式的 objectId 数组
【发布时间】:2016-03-10 03:22:51
【问题描述】:

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

我有以下架构的模型:

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
}

但是,当我这样使用填充命令时:

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 }

所以在结构上这是正确的,但它看起来好像填充函数只填充了两种类型中的第一种。

我是在突破可以执行的极限,还是有办法处理不同对象的数量?

我曾考虑使用鉴别器来使所有模型成为单个父类的子类,但我不希望这样做,如果我这样做,我不妨使用关系数据库。

--------编辑------ 在这一点上,如果不修改或创建插件,这似乎是不可行的。

对于任何有相同想法的人,我现在决定回到更传统的方法,我创建了一个 relatedRecordSchema,它存储了一个 Id 和一个记录类型以及一些其他有用的元数据。这实质上将填充逻辑推到了应用程序上。

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

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

干杯 乙

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    据我所知,填充适用于一个模式。您可以尝试通过提供不同的模型参数来对“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);
    });
    

    【讨论】:

    • 嗯。不幸的是,这不起作用,无论哪个填充第二个都单独存在于数组中。因此,您似乎可以在其中推送任意数量的模型,但一次只能填充一个。我会继续玩。谢谢
    猜你喜欢
    • 2021-03-03
    • 2013-04-08
    • 2021-01-06
    • 2015-04-20
    • 2018-06-04
    • 2017-04-20
    • 2017-10-08
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多