node.js - multiple - populate fields mongoose
Mangosta poblar matriz anidada (3)
Asumiendo los siguientes 3 modelos:
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}
});
Cuando consulto para Cars puedo llenar las partes:
Car.find().populate(''partIds'').exec(function(err, cars) {
// list of cars with partIds populated
});
¿Hay alguna forma de mangosta para poblar los otros ídolos en los objetos de partes anidadas para todos los automóviles?
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
});
});
Probablemente pueda iterar sobre cada auto e intentar llenarlo:
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
});
});
});
El problema es que tengo que usar una lib como asincronización para hacer la llamada de relleno para cada uno y esperar hasta que todos hayan terminado y luego regresar.
Posible hacer sin bucle sobre todos los coches?
Mangosta 4 apoya esto
Car
.find()
.populate({
path: ''partIds'',
model: ''Part'',
populate: {
path: ''otherIds'',
model: ''Other''
}
})
Utilice el plugin mongoose deepPopulate
car.find().deepPopulate(''partIds.otherIds'').exec();
Actualización: Consulte la respuesta de Trinh Hoang Nhu para una versión más compacta que se agregó en Mongoose 4. Resumido a continuación:
Car
.find()
.populate({
path: ''partIds'',
model: ''Part'',
populate: {
path: ''otherIds'',
model: ''Other''
}
})
Mangosta 3 y abajo:
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.
});
});
Para poblaciones anidadas como esta, debe indicar a mangosta el esquema del que desea rellenar.