2015-01-27 3 views
15

Предполагая, что следующие 3 модели:Mongoose заполнить вложенный массив

var CarSchema = new Schema({ 
    name: {type: String}, 
    partIds: [{type: Schema.Types.ObjectId, ref: 'Part'}], 
}); 

var PartSchema = new Schema({ 
    name: {type: String}, 
    otherIds: [{type: Schema.Types.ObjectId, ref: 'Other'}], 
}); 

var OtherSchema = new Schema({ 
    name: {type: String} 
}); 

Когда я запрашиваю для автомобилей я могу заселить части:

Car.find().populate('partIds').exec(function(err, cars) { 
    // list of cars with partIds populated 
}); 

Есть ли способ в мангустах для заполнения otherIds в вложенные детали для всех автомобилей.

Car.find().populate('partIds').exec(function(err, cars) { 
    // list of cars with partIds populated 
    // Try an populate nested 
    Part.populate(cars, {path: 'partIds.otherIds'}, function(err, cars) { 
    // This does not populate all the otherIds within each part for each car 
    }); 
}); 

Я, вероятно, может пройти по каждой машине и попытаться заполнить:

Car.find().populate('partIds').exec(function(err, cars) { 
    // list of cars with partIds populated 

    // Iterate all cars 
    cars.forEach(function(car) { 
    Part.populate(car, {path: 'partIds.otherIds'}, function(err, cars) { 
     // This does not populate all the otherIds within each part for each car 
    }); 
    }); 
}); 

Проблема есть в том, что я должен использовать LIB, как в асинхронном, чтобы сделать вызов заселить для каждого и ждать, пока все и затем вернуться.

Можно ли обойти все автомобили?

+0

метод это Заселите происходит внутри вашего ПОЛУЧИТЬ/пост маршрут правильно? – Winnemucca

ответ

29

Обновление: Пожалуйста, см Trinh Hoang Nhu's answer для более компактной версии, которая была добавлена ​​в Мангуста 4. Обобщенная ниже:

Car 
    .find() 
    .populate({ 
    path: 'partIds', 
    model: 'Part', 
    populate: { 
     path: 'otherIds', 
     model: 'Other' 
    } 
    }) 

Mongoose 3 и ниже:

Car 
    .find() 
    .populate('partIds') 
    .exec(function(err, docs) { 
    if(err) return callback(err); 
    Car.populate(docs, { 
     path: 'partIds.otherIds', 
     model: 'Other' 
    }, 
    function(err, cars) { 
     if(err) return callback(err); 
     console.log(cars); // This object should now be populated accordingly. 
    }); 
    }); 

Для вложенных групп населения, таких как это, вы должны сказать mongoose Schema, который вы хотите посетить поздно из.

+0

Crap RTFM;) Я вижу это сейчас. Однако независимо от того, что я пытаюсь, я возвращаю пустой массив для otherIds. Как проверка работоспособности Если я не вызываю метод populate, существует массив id (который является правильным). Population не заполняет эти идентификаторы. Запуск 3.8.22, последний с npm – lostintranslation

+0

Также включился вход в систему. Я не вижу другого вызова другой коллекции, чтобы заполнить «join». Поэтому мангуст даже не звонит. – lostintranslation

+2

@lostintranslation. Он должен быть «model:« Other »в этом вложенном вызове« populate ». – JohnnyHK

21

Mongoose 4 это

Car 
.find() 
.populate({ 
    path: 'partIds', 
    model: 'Part', 
    populate: { 
    path: 'otherIds', 
    model: 'Other' 
    } 
}) 
+2

Примечание: модель: «Другое». Без него он дает пустой массив. Документы не указывают его: http://mongoosejs.com/docs/populate.html#deep-populate –

Смежные вопросы