猫鼬嵌套/深度填充

Posted

技术标签:

【中文标题】猫鼬嵌套/深度填充【英文标题】:Mongoose nested/deep populate 【发布时间】:2015-02-09 00:08:36 【问题描述】:

我知道这个问题已经被问过很多次了,但我对 mongodb/mongoose 有点陌生!目前我正在为医疗软件开发 MEAN 堆栈。以下是我的架构:

var usersSchema = new Schema(
    _id      : type : mongoose.Schema.ObjectId
  //...
);
mongoose.model('Users', usersSchema);

var doctorsSchema = new Schema(
    _id      : type : mongoose.Schema.ObjectId,
    userid      : type : mongoose.Schema.ObjectId, ref : 'Users' ,
  //...
);
mongoose.model('Doctors', doctorsSchema);

var appointmentsSchema = new Schema(
  _id      : type : mongoose.Schema.ObjectId,
  doctorids       : [ type : mongoose.Schema.ObjectId, ref : 'Doctors' ]
  //...
);
mongoose.model('Appointments', appointmentsSchema);

嵌套猫鼬填充:如何在 Appointments.find() 上实现嵌套猫鼬填充,以使 Appointments.find().populate('doctorids') 填充医生数组并且Doctors数组反过来应该填充每个Doctor指向的用户。根据https://github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population,他们添加了 Model.Populate!所以我尝试了这个,但它没有填充医生ID中的用户

 

Appointments
  .find()
  .populate('doctorids')  // This is working
  .exec(function (err, doc) 
    if (err) 
      handleError(err);
      return;
    
    Doctors //**Shouldn't this populate the doctors Users inside Doctors?**
      .populate(doc, path: 'doctorids.userid', function(err, doc)        
    ); 
    res.json(
      appointments: doc //Appointsments.Doctorids[].Userid is NOT populated
    );
);  

[已编辑:将其他问题移至新帖子@https://***.com/questions/27412928/mongoose-nested-populate-sort-search-referenced-attributes]

【问题讨论】:

【参考方案1】:

有很多问题,我将只解决深层人口部分(第一个问题)。 (另外,我建议您将问题拆分为多个问题,以防人们对一个问题有答案,但不是全部。)

虽然 Mongoose 支持嵌套填充,但您必须在每个模型上手动调用 populate 才能在每个嵌套级别填充。或者,您可以使用mongoose-deep-populate 插件来执行此操作(免责声明:我是该插件的作者)。例如,您可以编写以下代码来填充医生和用户:

Apartments.find(, function (err, apts) 
  Apartments.deepPopulate(docs, 'doctorids.userid', function (err, apts) 
    // now every `apt` instance has doctors and user
  )
)

您还可以指定Mongoose populate options 来控制每个填充路径的排序顺序,如下所示:

var options = 
  doctorids: 
    options: 
      sort: '-name'
    
  

Apartments.deepPopulate(docs, 'doctorids.userid', options, cb)

查看插件documentation 了解更多信息。

【讨论】:

是否可以使用 deepPopulate 实现 3r 级人口? @AralRoca 是的,任何深度。

以上是关于猫鼬嵌套/深度填充的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中填充嵌套模型

在猫鼬中填充嵌套模型

猫鼬填充没有模型的嵌套模式

嵌套的猫鼬填充了承诺

如何在猫鼬中填充嵌套实体?

如何在猫鼬中异步填充嵌套对象?