2014-12-10 19 views
1

Я знаю, что этот вопрос задан много раз, но я вроде как новый для mongodb/mongoose! В настоящее время я работаю над стеком MEAN для медицинского программного обеспечения. Ниже моя схема:Mongoose inested/deep populate

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

Уплотненного Mongoose Populate:. Как осуществить вложенный мангуст заселить на Appointments.find() таким образом, что Appointments.find() заселить ('doctorids') следует заполнить массив докторов, а массив врачей, в свою очередь, должен заполнить пользователей, на которые указывает каждый Доктор. По https://github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population они добавили Model.Populate! Так что я попытался это, но его не заселять пользователей внутри doctorids

 

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]

ответ

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 populate options контролировать порядок сортировки для каждого населенного пути, как это:

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

Выезд плагином documentation для больше информации.

+0

Возможно ли 3-го уровня населения с глубиной населения? –

+0

@AralRoca да, любой уровень глубины. –