2

我知道这个问题已经被问过很多次了,但我对 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);

Nested Mongoose Populate:如何在 Appointments.find() 上实现嵌套的猫鼬填充,Appointments.find().populate('doctorids') 应该填充 Doctors 数组,而 Doctors 数组反过来应该填充每个医生指向的用户。根据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://stackoverflow.com/questions/27412928/mongoose-nested-populate-sort-search-referenced-attributes ]

4

1 回答 1

3

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

虽然 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 填充选项来控制每个填充路径的排序顺序,如下所示:

var options = {
  doctorids: {
    options: {
      sort: '-name'
    }
  }
}
Apartments.deepPopulate(docs, 'doctorids.userid', options, cb)

查看插件文档以获取更多信息。

于 2014-12-10T19:54:26.290 回答